怎么在DLL里面创建窗口 请教,要通过DLL与另一进程通信,已经实现共享内存读取数据,还需要DLL与另一进程发送消息,如果创建一个窗口来接收消息的话,创建窗口这些代码是应该放在DLLMAIN函数中还是外面,假设不用DLLMAIN函数的话,创建窗口这些代码又应该怎么放置呢?最好能提供个实例,谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以放在一个导出函数中 创建一个对话框 注意AFX_MANAGE_STATE(AfxGetStaticModuleState())的使用 mfc创建DLL教程,其中有如何在DLL创建对话框DLL,供其他进程使用的代码。http://download.csdn.net/source/846681 可以在DLLMAIN,可以单独线程序,单独的话,注意要有消息循环 可以在DLLMAIN,可以单独线程序,单独的话,注意要有消息循环 随便只要你在用到之前调用create它就好了 都已经实现共享内存读取数据了,用户界面窗口还是不要在DLL里面的好,叫DLL专注后台的工作。 转帖一篇:对话框: 对话框可以分为modal和modeless两种。在Win32 Dll中创建modal对话框。 在一个Win32Dll中创建modal对话框非常简单,我们都知道,Win32函数DialogBox能够创建一个modal对话框,并且modal对话框的消息是独立于主程序消息循环的,所以可以直接在Dll内部建立对话框自己的窗口过程。下面就是一个在Win32 Dll中创建modal对话框的示例://name: Modal_Dialog.cpp#include <windows.h>#include"resource.h"BOOL CALLBACK DlgProc(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam){ switch(Msg) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch(wParam) { case IDOK: MessageBox(NULL,"这是一个modal对话框的例子","提示",MB_OK); EndDialog(hwnd, 0); return TRUE; } break; } return FALSE;}extern"C" __declspec(dllexport) void ShowDialog(){ HINSTANCE hinst; hinst=LoadLibrary("Modal_Dialog.dll"); //获取库所在的实例句柄 DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc); FreeLibrary(hinst);}//name: Test.cpp…… typedef void (*fp)(); HINSTANCE hDll; fp Show; hDll = LoadLibrary("Modal_Dialog.dll"); Show = (fp)GetProcAddress(hDll,"ShowDialog"); (*Show)(); FreeLibrary(hDll);……在Win32 Dll 中创建modeless对话框。 与modal对话框不同,modeless对话框的消息是要经过主程序消息循环的,这样一来,就必须在调用该Dll的主程序中处理对话框的消息循环,这就无法达到利用Dll来完成组件化开发的要求。其实我们可以人为的Modeless对话框创建一个窗口类,我们知道窗口过程是属于窗口类的,这样一来就有了主窗口的消息循环。//name: Modeless_Dialog.cpp#include <windows.h>#include"resource.h"LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;extern"C" int __declspec(dllexport) ShowDialog(){ static TCHAR szAppName[] = TEXT ("Modeless_Dialog") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; HINSTANCE hInstance; HWND hDialog; hInstance = LoadLibrary("Modeless_Dialog.dll"); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = DLGWINDOWEXTRA ; // Note! wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (hInstance, szAppName) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; hwnd = CreateWindow (szAppName, TEXT ("Modeless_Dialog"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; // ShowWindow (hwnd, iCmdShow) ; //并不在这里显示主窗口 // UpdateWindow (hwnd) ; hDialog = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc) ; while (GetMessage (&msg, NULL, 0, 0)) { if(hDialog==0||!IsDialogMessage(hDialog,&msg)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } } return msg.wParam ;}BOOL CALLBACK DlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ switch(message) { case WM_INITDIALOG : return true; case WM_COMMAND: switch(wParam) { case(IDOK): MessageBox(NULL,"这是一个modeless对话框的例子","提示",MB_OK); DestroyWindow(hDlg); PostQuitMessage (0) ; return TRUE; } } return FALSE;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ switch (message) { case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ;} CreateDialog用来创建窗口,并且对话框模板要指定visible属性为True,只有这样才能显示对话框. if(hDialog==0||!IsDialogMessage(hDialog,&msg))这一句是起消息分流作用的,对于属于对话框的消息一律交给对话框过程DlgProc来处理。 处理对话框的退出一定要使用DetroyWindow函数,并且要发送一个退出消息,使那个没有显示的主窗口也能够退出消息循环,不至于造成内存泄露。 1,首先你要考虑自己创建的是模态对话框还是非模态对话框 模态 可以直接domodle的 非模态 需要自己写消息循环的,要是没有这个的话,就会一闪而过还有如何添加,当然是添加资源了啊。2,你看下我的这个帖子,会帮到你的http://topic.csdn.net/u/20090706/18/4ecd9f72-4ac8-4324-a465-33641c037510.html?seed=1633062597&r=59033426#r_59033426 在dll项目中,新加类 ,继承CDialog就行然后在dll的cpp文件中这样调用 //加在inclue文件后面CTest test;extern "C" __declspec(dllexport) void Show() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if(!test.create) { test.Create(IDD_DIALOG1); test.ShowWindow(SW_SHOWNOACTIVATE); } else { test.ShowWindow(SW_SHOWNOACTIVATE); } }dll的相关函数中call这个 show()函数就行 这条红线为什么没画出来? opengl绘图问题 如何把tif文件转换为bmp文件。 我刚注册的,为什么我没有自己的blog?? windows platform sdk安装问题 请教高手,WSAEWOULDBLOCK 错误请教 打开bmp文件 关于CFileDialog的一个简单问题! 求模糊综合评判的C或者VC程序 时间转换问题 d3d9 如何 开启全景抗锯齿 送分题
注意AFX_MANAGE_STATE(AfxGetStaticModuleState())的使用
http://download.csdn.net/source/846681
只要你在用到之前调用create它就好了
对话框可以分为modal和modeless两种。在Win32 Dll中创建modal对话框。
在一个Win32Dll中创建modal对话框非常简单,我们都知道,Win32函数DialogBox能够创建一个modal对话框,并且modal对话框的消息是独立于主程序消息循环的,所以可以直接在Dll内部建立对话框自己的窗口过程。下面就是一个在Win32 Dll中创建modal对话框的示例:
//name: Modal_Dialog.cpp
#include <windows.h>
#include"resource.h"
BOOL CALLBACK DlgProc(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
switch(Msg)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
switch(wParam)
{
case IDOK:
MessageBox(NULL,"这是一个modal对话框的例子","提示",MB_OK);
EndDialog(hwnd, 0);
return TRUE;
}
break;
} return FALSE;
}extern"C" __declspec(dllexport) void ShowDialog()
{
HINSTANCE hinst;
hinst=LoadLibrary("Modal_Dialog.dll"); //获取库所在的实例句柄
DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);
FreeLibrary(hinst);
}
//name: Test.cpp
……
typedef void (*fp)();
HINSTANCE hDll;
fp Show;
hDll = LoadLibrary("Modal_Dialog.dll");
Show = (fp)GetProcAddress(hDll,"ShowDialog");
(*Show)();
FreeLibrary(hDll);
……
在Win32 Dll 中创建modeless对话框。
与modal对话框不同,modeless对话框的消息是要经过主程序消息循环的,这样一来,就必须在调用该Dll的主程序中处理对话框的消息循环,这就无法达到利用Dll来完成组件化开发的要求。其实我们可以人为的Modeless对话框创建一个窗口类,我们知道窗口过程是属于窗口类的,这样一来就有了主窗口的消息循环。
//name: Modeless_Dialog.cpp
#include <windows.h>
#include"resource.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;extern"C" int __declspec(dllexport) ShowDialog()
{
static TCHAR szAppName[] = TEXT ("Modeless_Dialog") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
HINSTANCE hInstance;
HWND hDialog; hInstance = LoadLibrary("Modeless_Dialog.dll");
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = DLGWINDOWEXTRA ; // Note!
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (hInstance, szAppName) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
hwnd = CreateWindow (szAppName, TEXT ("Modeless_Dialog"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
// ShowWindow (hwnd, iCmdShow) ; //并不在这里显示主窗口
// UpdateWindow (hwnd) ;
hDialog = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc) ;
while (GetMessage (&msg, NULL, 0, 0))
{
if(hDialog==0||!IsDialogMessage(hDialog,&msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;}
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG :
return true;
case WM_COMMAND:
switch(wParam)
{
case(IDOK):
MessageBox(NULL,"这是一个modeless对话框的例子","提示",MB_OK);
DestroyWindow(hDlg);
PostQuitMessage (0) ;
return TRUE;
}
}
return FALSE;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
CreateDialog用来创建窗口,并且对话框模板要指定visible属性为True,只有这样才能显示对话框.
if(hDialog==0||!IsDialogMessage(hDialog,&msg))这一句是起消息分流作用的,对于属于对话框的消息一律交给对话框过程DlgProc来处理。
处理对话框的退出一定要使用DetroyWindow函数,并且要发送一个退出消息,使那个没有显示的主窗口也能够退出消息循环,不至于造成内存泄露。
模态 可以直接domodle的
非模态 需要自己写消息循环的,要是没有这个的话,就会一闪而过还有如何添加,当然是添加资源了啊。
2,你看下我的这个帖子,会帮到你的
http://topic.csdn.net/u/20090706/18/4ecd9f72-4ac8-4324-a465-33641c037510.html?seed=1633062597&r=59033426#r_59033426
//加在inclue文件后面
CTest test;
extern "C" __declspec(dllexport) void Show()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(!test.create)
{
test.Create(IDD_DIALOG1);
test.ShowWindow(SW_SHOWNOACTIVATE);
}
else
{
test.ShowWindow(SW_SHOWNOACTIVATE);
} }dll的相关函数中call这个 show()函数就行