Я построил DLL, которая вставляется в консольное приложение, обычно через SetWindowHookEx. Для DLL важно выводить информацию на консоль, которую я делал с std :: cout. DLL была близка к завершению, пока я не попытался собрать DLL в режиме выпуска, что сделало все строки cout бесполезными. Я проверил, что DLL внедряет и выполняет, выполняя простую разыменование null, которое вызывает сбой программы в функции dllmain. Та же история с std :: printf.
void onAttach()
{
//WARNING THIS IS A DEMONSTRATION
std::cout<<"test"<<std::endl;
//int* intPtr = 0;
//*intPtr = 3; //This causes a crash
}
// entry point
BOOL WINAPI DllMain ( HMODULE hModule, DWORD dwReason, LPVOID lpReserved )
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls ( hModule );
CreateThread ( NULL, 0, ( LPTHREAD_START_ROUTINE ) onAttach, NULL, 0, NULL );
return true;
break;
case DLL_PROCESS_DETACH:
return true;
break;
}
}
Я действительно не знаю, как подойти к этой проблеме. Компонент Release как-то исключает зависимости?
Я использую MSVS 2010 и настройки конфигурации выпуска / отладки по умолчанию. Dll отладки составляет около 5137 КБ, а dll выпуска — только 23 КБ.
Ты не должен делать что-нибудь в DllMain, которая зависит от другой DLL. Вы нарушаете это как минимум три раза: printf
а также std::cout
зависит от CRT (который, в свою очередь, зависит от Win32 DLL) и CreateThread
зависит от Kernel32.DLL.
DllMain
предназначен для простых вещей, таких как обнуление переменных и т. д.
Других решений пока нет …