我正在编写一个小DLL,一旦注入我的目标进程,就会找到hwnd
并将窗口的文本写入文件。我有这样的设置:
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 :(得分:0)
当然它崩溃了。 “在另一个进程中注入一个DLL”是你不应该首先做的事情,而当然并非如果你无法解决这个问题。
你的问题是你的DLL假设它正在运行的环境。特别是,你假设有一个C ++堆(或一个C堆,用于malloc
),并且它具有正确的状态你的计划。事实并非如此。普通的C ++规则不适用于注入的DLL;你的DLL必须能够站在自己的腿上。