为了实现【控制台主程序通过调用DLL显示对话框】这个效果,已经折腾两天了,今天终于有了一点眉目,特此记录。
2、定义DLL导出函数
程序实现的过程:
首先描述一下,我为什么这么做。我在写一个基于C语言运用DLL来实现的程序,其他的部分都封装在了不同的DLL里,主程序就是一个win32控制台程序。现在希望做一个界面来显示,因此就希望在写一个DLL,调用win32的接口,来做一个显示窗体。
一、主程序:
#include <stdio.h>
#include <Windows.h>
int main(int argc,char* argv[])
{
printf("hello world!\n");
typedef void (WINAPI* PROCFUN)();
HINSTANCE hInst1;
HWND hWnd;
hWnd=GetForegroundWindow();
hInst1 =LoadLibrary("DllDisplayDialog.dll");
PROCFUN _PROCFUN1=(PROCFUN)GetProcAddress (hInst1,"ShowDlg");
_PROCFUN1();
FreeLibrary(hInst1);
getchar();
return 0;
}
注释:主程序做两件事:1、测试控制台能否显示(用了printf语句);2、调用DLL的语句(定义函数类型、得到模块句柄、得到导出函数地址、运行函数)
二、DLL程序
DLL程序为一个win32 DLL程序【一定要是win32,不可以是MFC DLL】,主要实现的功能是生成一个对话框(供主程序调用),对话框上有控件,并且有自己的消息循环。DLL程序中主要包含有:
1、在DLL程序中加个两个对话框资源,IDD_DLG_MAIN和IDD_DLG_ABOUT,定义实例句柄和对话框窗体句柄,以及声明函数。
HINSTANCE hinst = NULL;
HWND hMainDlg = NULL;
HWND hAboutDlg=NULL;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
extern "C" __declspec(dllexport) void ShowDlg();
2、定义DLL导出函数
extern "C" __declspec(dllexport) void ShowDlg()
{
hMainDlg = (HWND)DialogBox(hinst,MAKEINTRESOURCE(IDD_DLG_MAIN), NULL,(DLGPROC)DlgProc);
SetWindowTextA(hMainDlg,"my");
ShowWindow(hMainDlg, SW_SHOWNORMAL);
UpdateWindow(hMainDlg);
}
3、定义两个对话框的消息响应函数
/*IDD_DLG_MAIN*/
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
if(LOWORD(wParam)==IDOK)
hAboutDlg = (HWND)DialogBox(hinst,MAKEINTRESOURCE(IDD_DLG_ABOUT), hDlg,(DLGPROC)AboutProc);
return TRUE;
case WM_CLOSE:
DestroyWindow(hDlg);
hMainDlg = NULL;
return TRUE;
}
return FALSE;
}
/*IDD_DLG_ABOUT*/
BOOL CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_CLOSE:
EndDialog(hDlg,NULL);
hMainDlg = NULL;
return TRUE;
case WM_COMMAND:
if(LOWORD(wParam)==IDOK)
SendMessage(hDlg,WM_CLOSE,0,0);
return TRUE;
}
return FALSE;
}
程序实现的过程:
先产生一个控制台(黑洞洞的cmd),然后弹出一个对话框(IDD_DLG_MAIN),点击上面的确认按钮,弹出第二个对话框(IDD_DLG_ABOUT),包含了一个Picture control和一个静态文本标签。
原文地址:
控制台主程序通过调用DLL显示对话框