2011-05-28 97 views
5

我正在写一DllMain的是这样的:Dllmain未被调用?

#include "main.h" 
#include "init.h" 
#include <iostream> 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
{ 
//std::cout<<"hi\n"; //only for debug. did not shown. 
switch (fdwReason) 
{ 
    case DLL_PROCESS_ATTACH: 
     // attach to process 
     // return FALSE to fail DLL load 
     //std::cout<<"hello\n"; //only for debug. did not shown. 
     init(); //did not run :(
     break; 

    case DLL_PROCESS_DETACH: 
     // detach from process 
     break; 

    case DLL_THREAD_ATTACH: 
     // attach to thread 
     break; 

    case DLL_THREAD_DETACH: 
     // detach from thread 
     break; 
} 
return TRUE; // succesful 
} 

,但使用的LoadLibrary测试程序()后,什么都没有发生, 没有打招呼或喜在屏幕上。 你想知道这个问题吗?非常感谢!

P.S.我看过这个问题DllMain not being called 但它仍然没有帮助。

PS2:主叫程序就像是

int main() 
{ 
cout<<"This is a test program to test.\n"; 
HINSTANCE hinstDLL; 
hinstDLL=LoadLibrary("ijl15.dll"); 
cout<<"Look like everything goes well.\n"; 
cout<<hinstDLL; 
return 0; 
} 

的测试程序的输出:

This is a test program to test. 
Look like everything goes well. 
0x6a980000 
Process returned 0 (0x0) execution time : 0.007 s 
Press any key to continue. 
+0

嗯...看起来好吧...你可以添加LoadLibrary()代码吗? 此外,只是为了确定 - 你正在寻找打印输出在控制台窗口,对吧? – TCS 2011-05-28 13:16:38

+0

我很乐意看到init()运行;但它永远不会所以我尝试了一些cout,但它仍然不起作用 – xxbidiao 2011-05-28 13:20:04

+0

你的连接器开关是什么? – 2011-05-28 15:47:15

回答

8

一些尝试后(很多:(),我发现,我错过了

#define DLL_EXPORT extern "C" __declspec(dllexport) 

这使得正确的函数名和最后的DLLMain调用成功。不管怎样谢谢大家!

+1

它是如何解决问题的?你在那里在代码中使用'DLL_EXPORT'? – 2016-08-29 08:10:29

1

我怀疑它是已关闭您的控制台交互代码。你可以尝试做一些不太微妙的事情,比如打开一个窗口或声音。

+1

OutputDe bugString()对于这类事情很好。 – Ferruccio 2011-05-28 14:55:30

+0

@Ferruccio在init()中还有其他一些东西,比如写日志到文件,但它根本不起作用......最后DLLMAIN失败了:(但是谢谢! – xxbidiao 2011-05-28 15:01:46

1

您在DLLMain中可以做的事情受到严重限制。具体来说,做任何I/O通常是一个禁忌。它在那里做一些简单的初始化,而不是像main()那样在可执行文件中执行。

+0

其实,hello和hi只是用于调试,init()没有运行 – xxbidiao 2011-05-28 13:18:10

+0

@xxbidiao好的,init()是做什么的? – 2011-05-28 13:24:36

+0

关于IO:你确定吗?在DllMain中AFAIK唯一可以依赖的是kernel32.dll被加载,Win32 IO函数在那里,显然你不能确定CRT是做什么的,但是直接使用win32 IO应该是安全的。无论如何,同意DllMain只是用于小型“内部”初始化,对于那些沉重的东西应该提供一个单独的函数 – 2011-05-28 13:31:12

0

LoadLibrary实际返回一个值(通过您的cout<<hinstDLL调用显示什么)?

你的dll是否在同一个目录下,或者通过PATH环境变量可用?

你在不同的地方有多个版本的dll(release vs debug)吗?

+0

测试程序的结果是:这是一个测试程序。 看起来一切都很顺利。 0x6a980000 进程返回0(0x0)执行时间:0.007秒 按任意键继续。 ...类似的东西 – xxbidiao 2011-05-28 23:23:32