由C++撰寫DLL檔讓DELPHI存取數值 |
|
juneo
高階會員 ![]() ![]() ![]() ![]() 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
寫程式常常需要與別人撰寫的程式配合,其中一種方式就是Dll檔
今天在跟大家分享如何由C++或C語言撰寫的DLL給Delphi使用 Testdll.h
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the TESTDLL_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// TESTDLL_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif // This class is exported from the TestDll.dll
class TESTDLL_API CTestDll {
public:
CTestDll(void);
// TODO: add your methods here.
}; extern TESTDLL_API int nTestDll; TESTDLL_API int fnTestDll(void);
TESTDLL_API DWORD fnTestDll_DWORD(void);
TESTDLL_API PCHAR fnTestDll_PCHAR(void); 注意重點:
TESTDLL_API int fnTestDll(void);
TESTDLL_API DWORD fnTestDll_DWORD(void);
TESTDLL_API PCHAR fnTestDll_PCHAR(void);
通常C語言撰寫者的DLL並不會有上面的格式,
可能只是很簡單的輸出
extern TESTDLL_API int nTestdll;
TESTDLL_API char *fnTestdll(void);//這種輸出會產生呼叫錯誤 如果你要給delphi讀取可能要採用上面的三種格式的其中之一
這樣就可以由Delphi內去呼叫,
並且將Testdll.h轉成Testdll.dll 以下是Delphi呼叫的部份
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, ExtCtrls; type
TForm1 = class(TForm)
Button1: TButton;
SpinEdit1: TSpinEdit;
Button2: TButton;
Button3: TButton;
SpinEdit2: TSpinEdit;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
function fnTestDll_DWORD : LongInt ; external 'testDLL.DLL' index 4; //宣告要呼叫的Dll
//function fnTestDll_DWORD : LongInt ; external 'testDLL.DLL'; //此種呼叫方式錯誤
function fnTestDll_PCHAR : LongInt ; external 'testDLL.DLL' index 3; //呼叫的類型不同
function fnTestDll : LongInt ; external 'testDLL.DLL' index 5; //呼叫的類型不同 implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
begin
spinedit1.Value := fnTestDll_DWORD; //使用第一種dll呼叫
end; procedure TForm1.Button2Click(Sender: TObject);
begin
spinedit2.Value := fnTestDll; //使用第二種dll呼叫
end; procedure TForm1.Button3Click(Sender: TObject);
begin
panel1.Caption := inttostr(fnTestDll_PCHAR); //使用第三種dll呼叫
end; end. 分享比獲得更快樂
|
juneo
高階會員 ![]() ![]() ![]() ![]() 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
|
Bluemirror
一般會員 ![]() ![]() 發表:2 回覆:6 積分:1 註冊:2004-07-26 發送簡訊給我 |
>>function fnTestDll_DWORD : LongInt ; external 'testDLL.DLL' index 4; 本行若改為
function fnTestDll_DWORD : LongInt ; external 'testDLL.DLL' name 'fnTestDll_DWORD';
應該也可以正確動作。(: LongInt應該可以不用加,且function後之函數名稱似乎可以自己重新定義。)
以下是在DELPHI程式發展手冊裡找到的資料:
========
以名字輸入,這種方式是以name關鍵字之後的名字來比對DLL裡的函式名稱。
以序數輸入可以減少DLL檔案load進來的時間;因為它不必到DLL函式名稱表格裡查詢函式的名字。但現在這個方法已經不建議使用了;因為Microsoft不再公佈Win32系統DLL的序數值,所以建議使用名字輸入。
========
以上這一段應該是針對使用Win32系統的DLL所做的建議。
可以參考看看。 >>請問為何我加上 index 4 就可以呼叫由C寫的Dll
>>但是不加上的時候就出現呼叫錯誤
|
Bluemirror
一般會員 ![]() ![]() 發表:2 回覆:6 積分:1 註冊:2004-07-26 發送簡訊給我 |
我將上面的Testdll.h 使用bcb 6的dll wizard,然後產生如下的code:
//--------------------------------------------------------------------------- #include
|
Bluemirror
一般會員 ![]() ![]() 發表:2 回覆:6 積分:1 註冊:2004-07-26 發送簡訊給我 |
|
william
版主 ![]() ![]() ![]() ![]() ![]() 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
juneo
高階會員 ![]() ![]() ![]() ![]() 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |