想在DLLMain函数中显示窗口,检查用户权限,单线程调用没有有关问题,多线程就不显示窗口内容了,高手教小弟我啊

想在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中另外创建一个线程,然后在这个线程中创建你的窗口
这个线程里只要有个简单的消息循环就可以了,窗口消息有这个线程负责处理

------解决方案--------------------
可以在主线程中显示窗口,数据线程中调用相关计算
------解决方案--------------------
可以看看用户界面线程的知识