Jiangsheng的CSDN Digest (Jan 1 2006)

CSDN 討論總結系列:


MSXML4.DLL中成功發送,MSXML.DLL中接收失敗 (VC/MFC ATL/ActiveX/COM )


MSXML4.DLL和MSXML.DLL都有IXMLHTTPRequest,爲了讓我的控件更具有移植性,我最終覺得使用MSXML.DLL。在改寫程序中挺困難,我將要發送的數據保存在一個流中,讓後通過IXMLHTTPRequest的SEND方法發送這個流,在我使用MSXML4.DLL時很順利,但是現在服務器接收到的流字節爲零。
爲了方便大家幫我糾錯,我把問題簡單化了



#include <windows.h>
#include <atlbase.h>
#include <iostream>

using std::cout;
using std::endl;

#import "msxml.dll"

int main()
{
::CoInitialize(0);
CComPtr<IStorage> spStr;
CComPtr<IStream> spStm;
HRESULT hr= S_OK;
try {

DWORD STG_FLAG= STGM_TRANSACTED | STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_DELETEONRELEASE;
if(FAILED(hr = ::StgCreateDocfile(NULL, STG_FLAG, 0, &spStr))) {
throwhr;
}

STG_FLAG= STGM_DIRECT | STGM_READWRITE | STGM_SHARE_EXCLUSIVE;
if(FAILED(hr = spStr->CreateStream(L"SendRequest", STG_FLAG, 0, 0, &spStm))) {
throwhr;
}

USES_CONVERSION;
LPSTR lpszVer= OLE2A(L"你好服務器,我是客戶端TestHttp2!");
int cblen= lstrlenA(lpszVer);
char buf[10];memset(buf, 0, 10);
itoa(cblen, buf, 10);
spStm->Write(lpszVer, cblen, NULL);
spStm->Commit(STGC_DEFAULT);

CComPtr<MSXML::IXMLHttpRequest> spHttp;
hr= spHttp.CoCreateInstance(__uuidof(MSXML::XMLHTTPRequest), NULL, CLSCTX_INPROC_SERVER);
hr= spHttp->open("POST", L"http://localhost:8080/root/serverAction.do?send=yes", false);
spHttp->setRequestHeader("Content-Length", buf);
spHttp->send(spStm.p);
} catch(HRESULT err) {
cout<< err << endl;
}
::CoUninitialize();
return0;
}


Commit之後沒有seek到開頭,讀寫共用一個流光標的


一個畫圖的ActiveX,但是隻要一有滾動條,ActiveX控件裏面就閃爍,怎麼去掉這個閃爍(Web 開發 JavaScript )


VC6.0寫的MFC ActiveX控件.
儘量用javascript方法解決.不改動ActiveX源代碼.謝謝

參考資料
http://support.microsoft.com/kb/233391


如果你的控件包含多個窗口,創建控件的時候加上WS_CLIPCHILDREN風格。
如果控件的繪製過程是自畫,那麼嘗試使用內存DC作爲緩衝,以及捕獲WM_ERASEBKGND並且直接返回,繞過默認的擦除過程。
參見
http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q310384

MFX做OCX,要求通過集合性質的屬性提供參數給用戶


在CToolBar上面創建一個IE作爲廣告。使用CHtmlView但是退出的時候總是提示內存出錯(VC/MFC 界面)


我想在CToolBar上面創建一個IE作爲廣告。
使用CHtmlView但是退出的時候總是提示內存出錯?
請問如何在CToolBar上面添加一個View類呢?我是直接new 的派生類


重載PostNCDestroy,不調用基類的處理。參見http://msdn.microsoft.com/msdnmag/issues/03/08/CQA/


在DLL中使用GDI+時GdiplusStartup和ShutDown在什麼地方調用好(VC/MFC 界面)


在DLLMain裏面調用可以嗎?


DLLMain裏面調用這兩個函數會造成死鎖。因爲這兩個函數會加載和卸載gdiplus.dll,而這又會調用DLLMain。參考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dllmain.asp
你可以導出調用這兩個函數的函數,然後在外部調用導出的函數。


文本框的問題(VC/MFC 基礎類 )


爲什麼CTRL+C CTRL+V 在文本框中不能用

程序是基於FORMVIEW 的
好象在程序中添加下列代碼就可以了
但我不知道爲什麼會這樣?
void CRecieve::OnEditCut()
{
// TODO: Add your command handler code here
m_ctrlReceiveData.Cut();
}
 


去掉Accelerator加速鍵表的相關內容就可以了,因爲Accelerator優先截取了你的輸入
Accelerator——IDR_MAINFRAME——ID_EDIT_COPY, ID_EDIT_CUT之類。參見http://msdn.microsoft.com/msdnmag/issues/02/05/c/


如何使用mschart這個控件(VC/MFC ATL/ActiveX/COM )


我用vc編寫程序,用到了這個控件顯示圖表。然後我將程序打包成setup以後,在一臺空白機子上安裝運行,發現控件不能創建。我的安裝包裏面有mschrt20.ocx這個控件,而且也是自動註冊的,可是就是不行。
當mschrt20.ocx這個控件存在系統中,而且是註冊過的,如果沒有裝vc,我的問題就出現了,如果裝了vc,我的問題就不出現了,好暈!
還有我說明一下:我的mschart這個控件不是直接添加到對話框上的,而是以對象的形勢創建生成的。如果是在對話框上添加這個控件,只要系統有mschrt20.ocx這個註冊的控件,那麼程序就會正常顯示,但是如果我以對象的形式create一個控件,就不行


有的控件創建的時候需要證書。一般情況下在對話框上添加控件時會自動生成運行時證書,但是手動創建時需要在代碼中手動添加證書。你可以單步跟蹤MFC的對話框創建代碼來查看證書內容。
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q151771

另外一種方法是手動修改註冊表。參見http://www.2okok.com/Article/Print.asp?ArticleID=39494


在控件中調用IsDialogMessage出錯(VC/MFC ATL/ActiveX/COM)


我在控件中開啓了一個無模式對話框作爲控件的界面,我在控件的PreTranslateMessage函數中寫了如下代碼:
return pMainWnd->IsDialogMessage(pMsg) || COleControl::PreTranslateMessage(pMsg);

結果是,當在IE中打開控件後,最小化IE,再還原,此時隨便按一下鍵盤上的某一個鍵,則程序進入死循環,
CPU佔百分之百,經過我的調試,發現是IsDialogMessage函數出錯,證據如下:
Beep(1500, 100);
Sleep(200);
BOOL re = pMainWnd->IsDialogMessage(pMsg);
MessageBeep(0);
Sleep(200);
if (!re)
re = COleControl::PreTranslateMessage(pMsg);

return re;
當Beep(1500, 100);和MessageBeep(0);不成對出現的時候,證明IsDialogMessage進入了死循環。
注:在一對話框上使用這個控件完全沒有上面的問題。


http://www.mvps.org/vcfaq/mfc/18.htm
http://support.microsoft.com/kb/q168777/


對操縱輸入法的詞庫熟悉的朋友請進來(VC/MFC 基礎類)


想對Microsoft (Simplified)- pinyin IME 3.0輸入法的詞庫進行操縱----增加詞組,刪除詞組,備份,不知道如何去做,請大家給點思路,先謝過!

我查到幾個用來實現功能的API,但沒有例子,不會用啊,

分別是:ImmGetRegisterWordStyle
ImmRegisterWord
ImmUnregisterWord


用LoadLibrary加載IME文件(那實際上是DLL),之後調用ImmRegisterWord函數。
在我的計算機上的微軟拼音輸入法 2003(v6.0.0.2527)的文件名是IMSC40A.IME。和其他回調一樣,寫一個
UINT CALLBACK 函數名(
LPCTSTR lpszReading,
DWORD dwStyle,
LPCTSTR lpszString,
LPVOID lpData
);

這樣的函數,然後把函數地址作爲EnumRegisterWordProc的參數。


VC++ 中哪些類具有排序功能(VC/MFC 基礎類 )


我看CArray 類沒有排序函數...


How to use the quick-sort function to sort MFC CArray-derived classes on the MFC and Visual C++ run-time library
http://support.microsoft.com/kb/216858


可以讓TWebBrowser只下載代碼而不執行嗎(Delphi 網絡通信/分佈式開發)


用WebBrowser.Navigate打開一個網頁後可否只讓其下載網頁的代碼,而不執行並顯示出來啊,要保證能用(WebBrowser.Document as IHTMLDocument2)調用網頁的元素。只是想要網頁的源代碼,網頁的顯示和執行都不要,當然,還有別的辦法可以獲得網頁的源代碼,但小弟做的這個動作非要用TWebBrower不可


只需要下載文件的話可以用URLDownloadToFile
只需要分析的話可以參考http://www.euromind.com/iedelphi/uilessparser.htm
也可以集成一個瀏覽器控件,在容器中處理DISPID_AMBIENT_DLCONTROL調用,返回DLCTL_DOWNLOADONLY標誌,參考http://www.euromind.com/iedelphi/embeddedwb.htm。


VS2005中將自定義控件加入工具箱的問題(.NET技術 VB.NET )


按網上的資料在寫了下列宏代碼, 將一個自己寫的控件加入工具箱:
---------------------------------------------------------------
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module Module1

Public Sub main()

Dim toolbox As ToolBox = Application.DTE.Windows.Item(EnvDTE.Constants.vsWindowKindToolbox).Object

Dim tooltab As ToolBoxTab = toolbox.ToolBoxTabs.Add("My Controls")

DTE.ExecuteCommand("View.PropertiesWindow")
tooltab.Activate()
tooltab.ToolBoxItems.Item(1).Select()

tooltab.ToolBoxItems.Add("MyControl", "d:/Mycontrol.dll", vsToolBoxItemFormat.vsToolBoxItemFormatDotNETComponent)
End Sub
End Module
------------------------------------------------------------------------------

該代碼在VS2003中能通過,並順利將控件加入工具箱, 而在VS2005中只能建立新的Tab, 卻不能加入控件, 但是如果先打開一下"Choose ToolBox Items"對話框, 然後關閉, 則上述代碼能夠通過.

曾試着在代碼裏添加:DTE.ExecuteCommand("Tools.AddRemoveToolboxItems") 來打開"Choose ToolBox Items"對話框, 但卻不知如果將其自動關閉.


http://blogs.msdn.com/chetanc/archive/2005/10.aspx

參考http://www2.cnblogs.com/haozidong/default.html?page=2
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章