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