在MFC中调用DLL

欲在。EXE 中调用PRO.DLL

PRO.DLL中函数如:

long MenuExecute( char *, long , HWND , long , char *, long , void * );

 

在.EXE端程序:

 

HINSTANCE hPro= ::LoadLibrary("Pro.dll");

if(hPro == NULL)

{

    return;

}

else

     typedef long (*MENU_EXECUTE)( char *, long , HWND , long , char *, long , void * );
     MENU_EXECUTE mebu = NULL;
     mebu=(MENU_EXECUTE)::GetProcAddress(hPro, "MenuExecute");//MenuExecute 函数名字

     if(mebu)

    {

         mebu(szMdbDir,
                  0L,
                 AfxGetApp()->m_pMainWnd->GetSafeHwnd(),
                 MENU_ID,
                 NULL,
                 0L,
                 NULL);   //执行DLL中相应函数

    }

     ::FreeLibrary(hPro);

 }

 

MFC调用DLL有多种方法,以下为详细介绍: ### 对话框形式DLL调用方法 1. **创建DLL项目**:建立一个MFC扩展的DLL-project(假设为ABC类),编写应用的对话框(假设为Dlg类)。 2. **编写导出函数**:在ABC.cpp中加入如下代码(假设用函数Show调用): ```cpp extern "C" __declspec(dllexport) void Show() { HINSTANCE save_hInstance = AfxGetResourceHandle(); //AfxSetResourceHandle(theApp.m_hInstance); AFX_MANAGE_STATE(AfxGetAppModuleState()); subdll dlg; dlg.DoModal(); AfxSetResourceHandle(save_hInstance); } ``` 3. **修改文件内容**:去掉CDlg.cpp中的`#include “ add additional includes here”`这一行;在stdax.h中加入`#include "resource.h"`,再编译。 4. **复制DLL文件**:将生成的DLL文件(假设是ABC.dll)复制到应用工程的目录下。 5. **在应用工程中调用**:在应用工程的view类中增加相应菜单函数,在该函数中复制代码: ```cpp typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ("ABC.dll"); if (hmod == NULL) { AfxMessageBox("载入动态链接库ABC.dll失败!"); } TESTDLL lpproc; lpproc = (TESTDLL)GetProcAddress (hmod, "Show"); if (lpproc != (TESTDLL)NULL) (*lpproc)(); FreeLibrary(hmod); ``` 6. **模式问题处理**:如果以上程序在debug模式下不正确,但是在release下正确,要将`Use MFC in a Shared DLL`更改成为`Use MFC in a Static Library`[^1]。 ### 调用常规的DLL方法 1. **编写DLL导出函数**:在.dll代码工程里面与def文件名称相同的cpp文件里面添加`#include "窗口文件名称"`,并定义导出函数,示例代码如下: ```cpp typedef __declspec(dllexport) void show() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); 窗口类名 dlg; dlg.DoModal(); } ``` 2. **在exe按钮事件中调用**: ```cpp void CCallDllDlg::OnButton1() { // TODO: Add your control notification handler code here typedef void (WINAPI * TESTDLL)(); HINSTANCE hmod; hmod = ::LoadLibrary ("WordChat_Dll.dll"); if (hmod == NULL) { AfxMessageBox("Fail"); } TESTDLL lpproc; lpproc = (TESTDLL)GetProcAddress(hmod, "ShowChatDlg"); if (lpproc != (TESTDLL)NULL) (*lpproc)(); FreeLibrary(hmod); } ``` ### 串口DLL调用方法 1. **复制文件**:复制生成的dll以及头文件到项目目录下,将dll放置到debug目录下,将头文件放到源文件目录下,修改此文件中得外部声明为`extern "C" __declspec(dllimport)`。 2. **调用DLL函数**: ```cpp typedef int (*pInit)(void); typedef BOOL (*pSend)(LPBYTE, int); HINSTANCE hInst = LoadLibrary(_T("commdll.dll")); if (hInst) { pInit initcomm = (pInit)GetProcAddress(hInst, "CommInit"); // 串口初始化,包括打开,设置参数 if (NULL == initcomm) { MessageBox(LPCTSTR("init error")); } else { initcomm(); pSend senddata = (pSend)GetProcAddress(hInst, "SendData"); // 发送数据 if (NULL == senddata) { MessageBox(LPCTSTR("DLL open error")); } else { UpdateData(TRUE); senddata((LPBYTE)(LPCTSTR)sendparam, sizeof(sendparam)); MessageBox(sendparam); UpdateData(FALSE); } } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值