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");
将多个静态库编译到动态库中,注意动态库代码生成->运行库要选择与静态库一致。