想在DLLMain函数中显示窗口,检查用户权限,单线程调用没有有关问题,多线程就不显示窗口内容了,高手教小弟我啊
想在DLLMain函数中显示窗口,检查用户权限,单线程调用没有问题,多线程就不显示窗口内容了,高手教我啊!
用VC写了个DLL,想在DLLMain函数中显示窗口,检查用户权限,单线程调用没有问题,多线程就不显示窗口内容了,高手教我啊!源码如下:
------解决方案--------------------
多线程调用无法显示窗口,应该是因为你创建窗口的线程没有消息泵,导致窗口消息得不到响应
你说的单线程调用的情况,肯定是在主线程创建你的对话框窗口的
两个解决方法:
第一种,保证在主线程首先加载DLL
第二种,你在DllMain中另外创建一个线程,然后在这个线程中创建你的窗口
这个线程里只要有个简单的消息循环就可以了,窗口消息有这个线程负责处理
------解决方案--------------------
可以在主线程中显示窗口,数据线程中调用相关计算
------解决方案--------------------
可以看看用户界面线程的知识
用VC写了个DLL,想在DLLMain函数中显示窗口,检查用户权限,单线程调用没有问题,多线程就不显示窗口内容了,高手教我啊!源码如下:
- C/C++ code
#include "stdafx.h" #include <Windows.h> #include "resource.h" using namespace std; string strMachine; HINSTANCE hinst = NULL; static HWND hwndDLG = NULL; static bool fWin = false; BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { hinst = (HINSTANCE)hModule; CSerialManager sm; strMachine = sm.GetMachineCode(); if(!fWin && hwndDLG == NULL) { fWin = true; hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DLG_SHOW), NULL,(DLGPROC)DlgProc); ShowWindow(hwndDLG, SW_SHOW); } } break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { char buff[255]; switch(message) { case WM_INITDIALOG: { HWND hwnd_Edit_Machine_Code =::GetDlgItem(hDlg,IDC_EDIT_MACHINE_CODE); ::SetWindowTextA(hwnd_Edit_Machine_Code,strMachine.c_str()); } return TRUE; case WM_COMMAND: if(LOWORD(wParam)==IDOK) { HWND hwnd_Edit_Serial =::GetDlgItem(hDlg,IDC_EDIT_SERIAL); ::GetWindowTextA(hwnd_Edit_Serial,buff, 255); ::SendMessage(hDlg,WM_CLOSE,0,0); } if(LOWORD(wParam)==IDCANCEL) { ::SendMessage(hDlg,WM_CLOSE,0,0); } return TRUE; case WM_CLOSE: DestroyWindow(hDlg); hwndDLG = NULL; return TRUE; } return FALSE; }
------解决方案--------------------
多线程调用无法显示窗口,应该是因为你创建窗口的线程没有消息泵,导致窗口消息得不到响应
你说的单线程调用的情况,肯定是在主线程创建你的对话框窗口的
两个解决方法:
第一种,保证在主线程首先加载DLL
第二种,你在DllMain中另外创建一个线程,然后在这个线程中创建你的窗口
这个线程里只要有个简单的消息循环就可以了,窗口消息有这个线程负责处理
------解决方案--------------------
可以在主线程中显示窗口,数据线程中调用相关计算
------解决方案--------------------
可以看看用户界面线程的知识