使用Delphi呼叫C++編寫的DLL
1、C++編寫的DLL程式碼如下:
該Dll的功能比較簡單,就是實現一個整數加法;
IAddBase 是一個抽象類,IAdd實現了IAddBase的方法,並採用了單例模式;
GetAddInstance()為dll對外的介面,返回一個IAdd的物件指標;
呼叫者使用該例項就可以呼叫Add方法
- class IAddBase
- {
- public:
- int virtual __stdcall Add(int a, int b) = 0;
- };
- class IAdd : public IAddBase
- {
- private:
- static Idd* m_Instance;
- protected:
- IAdd(){}
- ~IAdd()
- {
- if (m_Instance != NULL)
- delete m_Instance;
- }
- public:
- int __stdcall Add(int a, int b)
- {
- return a + b;
- }
- static IAdd* GetAddInstance()
- {
- if (m_Instance == NULL)
- m_Instance = new Idd();
- return m_Instance;
- }
- };
- Idd* IAdd::m_Instance = NULL;
- extern "C" __declspec(dllexport) IAddBase* GetAddInstance()
- {
- return Idd::GetAddInstance();
- }
2、在Delphi下呼叫該Dll,這裡採用靜態呼叫方法
- //在type中宣告IAddBase,相當於C++中的.h 檔案
- Type
- IAddBase = class
- public
- function Add(a, b : Integer):Integer;virtual;stdcall;abstract;
- end;
- function GetAddInstance : IAddBase ; cdecl ; external 'TestAdd.dll';
- var
- myAdd : IAddBase;
- implemetation
- //呼叫IAddBase中的Add方法
- function DoAdd(a,b:Integer):Integer;
- begin
- myAdd := GetAddInstance;
- result := myAdd.Add(a,b);
- end;
3、注意的問題
3.1 dll和delphi 定義的類函式需要宣告為stdcall,有疑問可以Google關鍵字:Delphi C++ stdcall
3.2 函式過載問題
如果在c++的dll中定義了一個具有相同函式名的類,則在Delphi中無法保證呼叫正確的函式,這裡要指出的是即使在定義時
宣告該函式為overload也無法保證正確呼叫dll中的對應函式
3.3函式定義的順序
Delphi中定義的類函式的順序必須和C++ .h檔案中定義的類函式順序保持一致,否則呼叫將會出錯。
相關文章
- Python呼叫C++編寫的方法PythonC++
- C#呼叫 C++的DLLC#C++
- C++呼叫 c#生成的dllC++C#
- C++呼叫C#的動態庫dllC++C#
- 【混合程式設計】C/C++呼叫Fortran的DLL程式設計C++
- 全方位解讀DLL檔案—編寫DLL
- 使用使用rundll32 呼叫指定dll的方法
- C# 呼叫 C++ 生成的 dll 關鍵實現部分C#C++
- exe呼叫DLL的方式
- NX二次開發-C#使用DllImport呼叫libufun.dll裡的UF函式(反編譯.net.dll)呼叫loop等UF函式C#Import函式編譯OOP
- 條款05: 瞭解c++默默編寫並呼叫哪些函式C++函式
- VS2012生成C的dll並呼叫以及Python呼叫C的DLLPython
- Qt/C++編寫的mqtt除錯助手使用說明QTC++MQ除錯
- 交叉編譯c++給android呼叫編譯C++Android
- C++ hpp檔案的編寫C++
- java編寫的介面可以呼叫python嗎JavaPython
- mingw 編譯生成的dll 如何在vs中使用編譯
- VS(visual studio) C++ 封裝dll,以及其隱式呼叫與顯式呼叫(靜態動態)C++封裝
- Nodejs如何呼叫Dll模組NodeJS
- C# 生成DLL 並 呼叫C#
- php 呼叫dll 裡面的方法PHP
- 【大型軟體開發】開發日誌(五).net框架與C++的融合:CLR——C++呼叫C#的DLL框架C++C#
- C++ 的函式分檔案編寫C++函式
- 呼叫Visual Studio的cl.exe編譯C/C++程式編譯C++
- JAVA呼叫C語言下的DLL檔案JavaC語言
- VS中呼叫DLL動態庫的方法
- java中呼叫dll檔案的步驟Java
- 如何編寫 C++ 遊戲引擎C++遊戲引擎
- c# 呼叫 C++ dll 傳入傳出型別對應說明(轉)C#C++型別
- QT6編寫外部庫並呼叫QT
- protobuf 的交叉編譯使用(C++)編譯C++
- Windows上Python使用swig呼叫C++WindowsPythonC++
- 編寫可移植C/C++程式的要點C++
- json的使用(python寫,c++讀)JSONPythonC++
- C++ 反彙編:關於函式呼叫約定C++函式
- Delphi TMSMQTT使用筆記MQQT筆記
- 實現通過COM元件方式實現java呼叫C#寫的DLL檔案的完整demo元件JavaC#
- 使用THEOS編寫Tweak
- java呼叫DLL,呼叫北洋印表機列印二維碼標籤Java