在DLL中创建不影响主程序的窗口
需要在DLL中创建一个窗口,现有一段代码:BOOLAPIENTRYDllMain(HANDLEhModule,DWORDul_reason_for_call,LPVOID...
需要在DLL中创建一个窗口,现有一段代码:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
char szClassName[ ] = "窗口标题";
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
wincl.hInstance = GetModuleHandle(NULL);
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
CreateWindowEx (0,szClassName,NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1,1, HWND_DESKTOP, NULL,NULL, NULL );
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
我的EXE加载这个DLL以后就无法出现界面了,在任务管理器中仅仅有一个进程名,请问该如何修正? 展开
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
char szClassName[ ] = "窗口标题";
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
wincl.hInstance = GetModuleHandle(NULL);
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
wincl.style = CS_DBLCLKS; /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
if (!RegisterClassEx (&wincl))
return 0;
CreateWindowEx (0,szClassName,NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1,1, HWND_DESKTOP, NULL,NULL, NULL );
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
我的EXE加载这个DLL以后就无法出现界面了,在任务管理器中仅仅有一个进程名,请问该如何修正? 展开
2个回答
展开全部
楼主,我有N多的问题想问你,很多程序细节楼主都没给出。
你的EXE是如何加载这个DLL的?
要知道如果是隐式链接,如果不引用DLL中的任何导出函数,则链接器会把该DLL从EXE的导入段中给取出的,最终导致DLL根本不会被加载到进程中。楼主需要用“进程查看器”之类的工具看下你的DLL是不是真的被加载到了EXE的地址空间了。
既然是DLL,那么DLL中最基本的DllMain含义楼主应该清楚吧,就像学习控制台编程,如果连main的含义都是一知半解就糟糕了。
要知道DllMain在 ul_reason_for_call等于DLL_PROCESS_ATTACH时,必须使DllMain函数返回TRUE,EXE才会成功加载该DLL的。
不管是隐式链接,还是显式链接, ul_reason_for_call的值最初都是DLL_PROCESS_ATTACH,我看见楼主的DLL代码根本就不对 ul_reason_for_call的值进行任何检查。起初, ul_reason_for_call的值为DLL_PROCESS_ATTACH,楼主必须应该使DllMain返回(return)TRUE,只有酱子EXE才会真正加载了这个DLL,可while(...)代码使得DllMain这个函数根本没有机会返回TRUE or FALSE;最奇怪的是最后是return messages.wParam。对于while这个语句的调用究竟放哪里好呢?呵呵,有办法的,但解释起来太麻烦了,估计楼主也无法理解。
楼主程序的构建环境是DLL,不能照搬EXE中的代码的,需要灵活运用,灵活应用的基础是要理解代码的含义,光知道有什么函数,有什么数据结构和怎样的调用顺序是远远不够的。
另外,提醒的是在DLL的DllMain有个很重要的hModule参数,这个参数就如同人的脊椎骨,绝对不能无视它的存在。像wincl.hInstance 的值就应该是hModule.
hModule究竟是什么东西,楼主需要有两块基石,一块是“进程地址空间布局”的分支知识,另一块是“PE文件布局”的分支知识。不易学习!
最后,不对ul_reason_for call进行检查也会使事情一团糟。要知道DllMain这个函数并不是只会被EXE调用一次的,当EXE程序对应的进程创建一个新的线程时,该函数也会被调用的,这个时候ul_reason_for_call值为DLL_THREAD_ATTACH,想象一下,如果进程里又创建了个新线程,楼主的DLL又会再创建一个窗口,这个算什么呢?当然,这个窗口在第二次是创建不起来的,因为RegisterClassEx会失败。
你的EXE是如何加载这个DLL的?
要知道如果是隐式链接,如果不引用DLL中的任何导出函数,则链接器会把该DLL从EXE的导入段中给取出的,最终导致DLL根本不会被加载到进程中。楼主需要用“进程查看器”之类的工具看下你的DLL是不是真的被加载到了EXE的地址空间了。
既然是DLL,那么DLL中最基本的DllMain含义楼主应该清楚吧,就像学习控制台编程,如果连main的含义都是一知半解就糟糕了。
要知道DllMain在 ul_reason_for_call等于DLL_PROCESS_ATTACH时,必须使DllMain函数返回TRUE,EXE才会成功加载该DLL的。
不管是隐式链接,还是显式链接, ul_reason_for_call的值最初都是DLL_PROCESS_ATTACH,我看见楼主的DLL代码根本就不对 ul_reason_for_call的值进行任何检查。起初, ul_reason_for_call的值为DLL_PROCESS_ATTACH,楼主必须应该使DllMain返回(return)TRUE,只有酱子EXE才会真正加载了这个DLL,可while(...)代码使得DllMain这个函数根本没有机会返回TRUE or FALSE;最奇怪的是最后是return messages.wParam。对于while这个语句的调用究竟放哪里好呢?呵呵,有办法的,但解释起来太麻烦了,估计楼主也无法理解。
楼主程序的构建环境是DLL,不能照搬EXE中的代码的,需要灵活运用,灵活应用的基础是要理解代码的含义,光知道有什么函数,有什么数据结构和怎样的调用顺序是远远不够的。
另外,提醒的是在DLL的DllMain有个很重要的hModule参数,这个参数就如同人的脊椎骨,绝对不能无视它的存在。像wincl.hInstance 的值就应该是hModule.
hModule究竟是什么东西,楼主需要有两块基石,一块是“进程地址空间布局”的分支知识,另一块是“PE文件布局”的分支知识。不易学习!
最后,不对ul_reason_for call进行检查也会使事情一团糟。要知道DllMain这个函数并不是只会被EXE调用一次的,当EXE程序对应的进程创建一个新的线程时,该函数也会被调用的,这个时候ul_reason_for_call值为DLL_THREAD_ATTACH,想象一下,如果进程里又创建了个新线程,楼主的DLL又会再创建一个窗口,这个算什么呢?当然,这个窗口在第二次是创建不起来的,因为RegisterClassEx会失败。
展开全部
呵呵,你这个似乎应该用远程进程注入。具体步骤请看我的另一篇回答:http://zhidao.baidu.com/question/133876851.html
另外,为什么非要把窗体代码放到DLL中呢?
另外,为什么非要把窗体代码放到DLL中呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询