带对话框的dll


1.新建项目 -> Visual C++ -> MFC -> MFC DLL -> 如名字:Test
2.打开工程的资源视图 -> 在Test.rc上右键添加资源 -> 对话框 -> 新建
3.在对话框上右键单击弹出菜单 -> 添加类 -> 类名MyDlg,基类CDialog
4.新建TestAPI.h和TestAPI.cpp文件,内容如下:
TestAPI.h:
#pragma once
extern "C" __declspec(dllexport) void ShowMyDlg();

TestAPI.cpp
#include <stdafx.h>
#include "TestAPI.h"
#include "MyDlg.h"

extern "C" __declspec(dllexport) void ShowMyDlg()
{
    // 注意这里,一定要在每个导出的接口实现的第一句加上
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    MyDlg dlg;
    dlg.DoModal();

}


5.这样就可以编译了,如果编译的过程中发现找不到IDD_DIALOG1,那么就加上头文件#include "Resource.h"

调用:
    void (WINAPI* ShowMyDlg)();
    HMODULE hModule = LoadLibrary(L"Test.dll"); // Test.dll放在能找到的路径
    if (hModule)
    {
        (FARPROC&)ShowMyDlg = GetProcAddress(hModule, "ShowMyDlg");
        if (ShowMyDlg)
        {
            ShowMyDlg();
        }
        else
        {
            MessageBox(L"get proc address failed");
        }
    }
    else
    {
        MessageBox(L"load library Test.dll failed!");

    }


上面介绍的MFC带对话框的dll,如果是win32工程,使用windows api创建的窗口,需要注意HINSTANCE(资源句柄),通常使用GetModuleHandle(NULL)来获取这个值,但是如果是dll被可执行程序调用的话,那么这个API获取的是可执行程序的资源句柄,显然这个是不对的,因为我们的窗口资源在dll里面,所以GetModuleHandle的参数必须是这个dll的名字,如:GetModuleHandle(L"mytest.dll");


将多个静态库编译到动态库中,注意动态库代码生成->运行库要选择与静态库一致。


你可能感兴趣的:(带对话框的dll)