控制台主程序通过调用DLL显示对话框

来源:互联网 发布:法律大数据解决方案 编辑:程序博客网 时间:2024/06/01 09:30

 为了实现【控制台主程序通过调用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和一个静态文本标签。
0 0