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);

}

//程序中紅色字體一定要標注(個別的教材會沒標,但不知道為什么他們居然沒問題),否則會獲取函數地址失敗,或者函數名"變味"了.

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM