vs2010 MFC DLL创建和调用

今天把vs2010重新修复重装了,曾经所有崩溃现象基本上不存在,一直以为是AMD芯片拼不过wintel的原因,不过wintel开发软件放到其他PC上运行比AMD上编译出来的要稳定一些,曾今做了一个软件,在AMD上编译通过,到wintel上运行经常报错,结果查看错误报文,大致用english说不兼容AMD某个寄存器,所以立即改在wintel上编译,救过就OK了.

说了几句无关的话,只是太无聊了,所以聊一聊.

<1> : 创建DLL工程:选MFC Template,然后右侧选择MFC DLL项,点击OK

 

<2> : 一般的到这一步可以选择"Finish"

<3> : 如果上面点击"Next":

<4> : 进入开发界面,点开"Solution Explorer",打开"CMFCDLLDemo01.h",在头部声明:

extern "C" int PASCAL EXPORT Add(int a,int b);
extern "C" void PASCAL EXPORT COpenFile();

在这里我直接声明两个函数,并且打算将其导出.

<5> : 打开"CMFCDLLDemo01.cpp",添加函数体如下:

extern "C" int PASCAL EXPORT Add(int a,int b){
 return (a+b);
}

extern "C" void PASCAL EXPORT COpenFile(){

 CFileDialog dlgFile(TRUE);
 CString fileName;
 const int c_cMaxFiles = 100;
 const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
 dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(c_cbBuffSize);
 dlgFile.GetOFN().nMaxFile = c_cMaxFiles;

 dlgFile.DoModal();
 fileName.ReleaseBuffer();

}

<6> : 在"CMFCDLLDemo01.def"文件中添加导出函数名和库名:

LIBRARY "MFCDLLDemo"

EXPORTS
    ; Explicit exports can go here
 Add @1
 COpenFile

//在VC6.0需要自行用记事本输入上面内容并且保存为def扩展名文件,让工程->添加文件的方式导入该文件,vs2010这里事先已经添加好了.

<7> : build后生成对应的.dll和.lib文件;

<8> : 静态调用:适合外来导入的库文件不多的情况下,新建一个dialog工程后,菜单project->CMFCDLLDemo01 property:

添加编译好的lib路径进去.如果"MFCDLLDemo01.h"文件没有设置路径,就直接将其拷贝到工程目录下即可,给出这个文件是为了提供接口函数,方便其他程序员方便调用!

<9> : 添加一个按钮,然后添加相应消息:

#include "MFCDLLDemo01.h"
#pragma comment(lib,"MFCDLLDemo01.lib");
void CMFCTestDLLDlg::OnBnClickedButton1()
{
 // TODO: Add your control notification handler code here
 CString f;
 int b;
 b=Add(10,12);
 f.Format(L"Add Value : %d",b);
 MessageBox(f);
}

<10> : 动态调用:

void CMFCTestDLLDlg::OnBnClickedButton2()
{
 // TODO: Add your control notification handler code here
 UpdateData();
 HINSTANCE hInstalib=LoadLibrary(L"MFCDLLDemo.dll");
 typedef int (WINAPI *ADDPROC) (int a,int b);
 if(hInstalib==NULL){
  FreeLibrary(hInstalib);
 }
 ADDPROC Add=(ADDPROC)GetProcAddress(hInstalib,"Add");
 if(!Add){
  FreeLibrary(hInstalib);
 }

 CString s;
 int f=0;
 f=Add(10,12);
 s.Format(L"Add Value : %d",f);
 MessageBox(s);

 FreeLibrary(hInstalib);
}


void CMFCTestDLLDlg::OnBnClickedButton3()
{
 // TODO: Add your control notification handler code here
 UpdateData();
 HINSTANCE hInstalib=LoadLibrary(L"MFCDLLDemo.dll");
 typedef void (WINAPI *ADDPROC)();
 if(hInstalib==NULL){
  FreeLibrary(hInstalib);
 }
 ADDPROC OpenF=(ADDPROC)GetProcAddress(hInstalib,"COpenFile");
 if(!OpenF){
  FreeLibrary(hInstalib);
 }

 OpenF();

 FreeLibrary(hInstalib);

}

//程序中红色字体一定要标注(个别的教材会没标,但不知道为什么他们居然没问题),否则会获取函数地址失败,或者函数名"变味"了.

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/MMLoveMeMM/articles/3025311.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值