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。 謝謝。
我不確定,但可能的原因可能是'SendMessageW'將寬字符寫入'buffer',但'buffer'是'char'緩衝區。意味着它的整體尺寸比所需要的小50%。將'buffer'的類型更改爲'wchar_t'並改爲使用'wofstream'。 – hmjd
@hmjd到目前爲止,它並沒有墜毀。謝謝。 – qassdu
我強烈建議您查找一些確認此行爲的文檔,而不要依靠通過觀察進行確認。但是,你知道'GetWindowText()'和'InternalGetWindowText()'嗎? – hmjd