DLL вызывает сбой программы только при выделении памяти
Я пишу небольшую библиотеку 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, если бы хотел написать серьезную программу. Благодарю.
1 ответ
Конечно, это вылетает. "Внедрение DLL в другой процесс" - это то, что вы не должны делать в первую очередь, и, конечно, нет, если вы не можете понять это.
Ваша проблема в том, что ваша DLL делает предположения о среде, в которой она работает. В частности, вы предполагаете, что есть куча C++ (или куча C, для malloc
), и это имеет точно правильное состояние для вашей программы. Это просто не тот случай. Обычные правила C++ не применяются к внедренным DLL; Ваша DLL должна быть в состоянии стоять на собственных ногах.