C dll 學習記錄

2021-07-03 06:57:33 字數 2716 閱讀 7067

一直做伸手黨,有問題基本就是google和度娘,平時也很懶惰,水平一般,是時候靜心,學學知識,寫寫部落格,當然,菜鳥寫不出什麼東西,權當自己的日記了。萬一寫錯了,看到的朋友切勿人參公雞啊。寫出來的東西,全部是平時遇到的問題,當然都是google或者度娘來的,但是文字或者**都是

自己擼出來的,唉,還有自己的表達能力太差了,有時候心裡明白的東西,到嘴邊了,就是說不清楚,廢話不說了。。。

參加工作後,第乙份開發的工作是windows方面的開發,首先接觸到的是com元件的開發,那最基本的還是要學習dll的基本知識。就是dll裡的函式如果要被外部呼叫,都要宣告為匯出函式。當然還可以匯出類,外部使用者呼叫這個類,這個類也是需要宣告匯出類.現在我的動態庫里是這樣一種情況,dll裡匯出乙個介面,getcar用來獲得dll內部類的乙個指標(例項**,且暫不考慮dll裡指標記憶體釋放的問題),內部有乙個ccar的類,封裝了很多功能,通過匯出函式來獲取這個類的乙個例項,但是這個內部類也要申明為匯出類,否則回報鏈結錯誤,例項**如下:

dll裡的標頭檔案

// mydll_api 函式視為是從 dll 匯入的,而此 dll 則將用此巨集定義的

// 符號視為是被匯出的。

#ifdef mydll_exports

#define mydll_api __declspec(dllexport)

#else

#define mydll_api __declspec(dllimport)

#endif

//dll 內部定義的乙個類,封裝實現功能

class ccar

;//匯出的函式(介面),讓使用者獲得ccar類的乙個例項的指標

mydll_api ccar* getcar(void);

dll裡的乙個實現檔案
// mydll.cpp : 定義 dll 應用程式的匯出函式。

//#include "stdafx.h"

#include "mydll.h"

#include // 這是匯出函式的乙個示例。

mydll_api ccar* getcar(void)

//ccar類的實現

ccar::ccar()

ccar::~ccar()

void ccar::run()

另外乙個測試程式,通過隱式載入使用上面的dll,上面的dll已經順利編譯通過,並且生成lib和dll檔案。

// dlltest.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include "../mydll/mydll.h"

#include "iostream"

int _tmain(int argc, _tchar* argv)

錯誤如下

錯誤2error lnk1120: 1 個無法解析的外部命令f:\me\project\vs2013\dlltest\debug\dlltest.exedlltest

錯誤1error lnk2019: 無法解析的外部符號 "public: void __thiscall ccar::run(void)" (?run@ccar@@qaexxz),該符號在函式 _wmain 中被引用f:\me\project\vs2013\dlltest\dlltest\dlltest.objdlltest

就是ccar的方法沒有匯出,導致鏈結出錯,當然修改這個問題,只要在dll類的標頭檔案裡把ccar宣告為匯出類即可,如下

//匯出的類 宣告

class mydll_api ccar

;

重現編譯dll,再重新編譯執行外部程式,即可成功呼叫。

執行結果如圖所示:

當然這不是重點,有時候並不想把類匯出,我只想通過我匯出的介面讓客戶來使用,以前學習的時候有這樣一種方法,不知道正不正規啊,但是有點類似com元件的實現,通過虛函式來實現,再定義何以抽象類,讓原來的ccar繼承這個抽象類,那裡面的類都不用宣告為匯出類,編譯可以通過,並且正常使用。**片段如下:

#define mydll_api __declspec(dllexport)

#else

#define mydll_api __declspec(dllimport)

#endif

//宣告乙個抽象類

class icarbase

~icarbase(){}

virtual void run() = 0;

};//匯出的類 宣告

class ccar : public icarbase

;//匯出的函式(介面)

mydll_api ccar* getcar(void);

上面的**就增加了乙個基類,把類中讓使用者想呼叫的函式宣告為虛函式,那使用者就可以呼叫這個類的函式(介面)了,同時類中宣告的時候不用加上這個巨集了,mydll_api,把這個巨集從類宣告中去掉。其餘**都不變。

這樣就利用了虛函式動態繫結的原理,外部呼叫動態庫中的類方法時,不用在編譯階段確定方法的位址,那就不用把類宣告為匯出類了,根據以前學的com元件的一點小知識,com元件用c++估計也是這樣實現的把,沒有深入研究過,自己的猜測而已。

回頭看了看自己的第一篇部落格,唉。。。。好難看啊,都表達不清楚。。。

C 呼叫C DLL問題記錄

最近做乙個將c 框架的openh323功能介面封裝成供c 呼叫的動態鏈結庫的工作,由於本人基本屬於c 白痴,故封裝過程中遇到諸多問題。多謝同事 頭已經網上各位大牛的幫助,遇到的問題終歸能夠找到解決方法。為了避免以後再遇到同樣的問題不從下手,且供未知如我般c 新手參考,記錄如下 一 c 的字符集 c ...

C DLL匯出函式

有兩種方式,一是寫def檔案,二是用 declspec dllexport 修飾。相對來說,我更喜歡用後一種方式,這樣不用多寫乙個檔案。如果呼叫dll的 也是c 的,可能這樣寫沒有什麼問題,但是delphi程式呼叫的話就有問題了,c 編譯器把函式修飾名給修改了,用depends檢視dll的話能看到原...

C dll 封裝例項

給乙個dll封裝的例子 函式名稱 fft 引數 complex td 指向時域陣列的指標 complex fd 指向頻域陣列的指標 r 2的冪數,即迭代次數 返回值 無。說明 該函式用來實現快速傅利葉變換 void fft complex td,complex fd,int r 將時域點寫入x1 m...