2013-04-16 56 views
0

我正在寫一個小的DLL,一旦注入到我的目標進程中,將找到hwnd並將窗口的文本寫入文件。我有它的設置是這樣的:DLL導致程序崩潰時只分配內存

hWnd = FindWindow(L"tSkMainForm",NULL); 
chat = FindWindowEx(hWnd, NULL, L"TConversationForm", NULL); 
ofstream myfile("X:\\Handles.txt", ios::out | ios::app); 
if (myfile.is_open()) 
{ 
    int len; 
    len = SendMessage(chat, WM_GETTEXTLENGTH, 0, 0) + 1; // + 1 is for the null term. 
    char* buffer = new char[len]; 
    SendMessageW(chat, WM_GETTEXT, (WPARAM)len, (LPARAM)buffer); 
    myfile.write(buffer,len); /* << buffer <<endl; */ 
    myfile.close(); 
    delete[] buffer; 
} 

它工作的時間看似隨意的量,然後在應用程序軟件(Skype)崩潰。它只在分配內存時崩潰。我曾嘗試使用malloc與:

char* buffer = (char*)malloc(len); //I even tried removing "(char*) before malloc 
//Do the rest of the stuff here 
free((void*) buffer); 

但也是崩潰了。

我的DLL調用CreateThread,通過AppendMenu增加了一個額外的菜單項,並且完美地處理了它的消息。似乎分配內存不想工作,但只是在隨機時間。我不確定,但我認爲Skype會覆蓋我的記憶,或者我覆蓋Skype的內存(我如何確保兩者不會互相覆蓋?)

另外,我知道Skype存在一個API ,但我想這樣做。如果我想寫一個認真的程序,我會使用Skype API。 謝謝。

+0

我不確定,但可能的原因可能是'SendMessageW'將寬字符寫入'buffer',但'buffer'是'char'緩衝區。意味着它的整體尺寸比所需要的小50%。將'buffer'的類型更改爲'wchar_t'並改爲使用'wofstream'。 – hmjd

+0

@hmjd到目前爲止,它並沒有墜毀。謝謝。 – qassdu

+0

我強烈建議您查找一些確認此行爲的文檔,而不要依靠通過觀察進行確認。但是,你知道'GetWindowText()'和'InternalGetWindowText()'嗎? – hmjd

回答

0

當然,它崩潰。 「在另一個進程中注入DLL」是你不應該做的事情,如果你不能弄明白的話,肯定是

你的問題在於你的DLL對它所運行的環境做了假設。特別是,你認爲有一個C++堆(或C堆,爲malloc),這對你的程序來說恰好是正確的狀態。情況並非如此。正常的C++規則不適用於注入的DLL;你的DLL必須能夠站在自己的腿上。