使用Delphi宣告C 帶函式的結構體實戰

2021-04-16 02:12:57 字數 2488 閱讀 2302

在小組開發中,應用程式部分採用delphi7,一些元件使用c++做。在今天將乙個動態庫的c++介面宣告標頭檔案轉換為d7的unit單元時,一切都很順利,直到遇到下面這樣乙個另類的東西:

typedef struct tagrecord

}trecord, *precord; 

帶函式的結構體!面對這個面目猙獰的傢伙,我開始無所適從,狂在google、baidu裡通過關鍵字「delphi 帶函式的記錄型別」、「delphi c++ 結構體 函式」、「delphi record function」......結果都是無功而返。

一邊搜尋,還一邊通過編碼測試來尋找問題解決門道。起初我嘗試效仿採用函式指標的方式,結果函式體無法實現,更不用說訪問結構體其他成員了。

後面又一次試著採用class而非record型別來宣告:

precord = ^trecord;

trecord =class

public

val: integer;

functiongetvalplus():integer;

end;

在介面部分:functionshowvalue(rcd: precord):integer;

stdcall;external'structdll.dll';

引數rcd無論宣告為precord還是pointer,傳遞進去之後debug除錯出來的值根本就不對,疑似某物件的位址之類的數字。去俺們圈子的技術群裡請教高手結果還引來「**、真賤」的一頓罵,哪兒有這麼用的?不吃飽了撐得嗎?那你就考慮考慮採用**模式來迂迴解決吧!......這個時候,我幾乎絕望了,特別無助,我的印象裡,在win32開發這片沃土裡,delphi和c++本就一脈相承的啊,但面對這個細節的時候我發現原來景色並不是那麼美好。

無奈之下到csdn社群的delphi->api板塊發帖提問,這時也臨近中午,吃了幾口麵包,吞了兩缸涼白開睏意來了,撂倒就是一覺......哪知一覺醒來發現有人回帖了,雖然他在d2007上驗證通過,但我還是抱著試試看的想法在d7上開始測試。沒成想,嘿!果然有效哎!你看看:

在dll庫里的宣告(c++):

typedef struct

tagrecord

}trecord, *precord;

extern

"c"__declspec(dllexport) int

__stdcall

showvalue(trecord *rcd)

在d7中的宣告:

type

precord = ^trecord;

trecord =object

public

val: integer;

functiongetvalplus():integer;

end;

functionshowvalue(rcd: precord):integer;

stdcall;external

'structdll.dll';

implementation

functiontrecord.getvalplus():integer;

begin

val := val + 1;

result := val;

end;

在d7中的呼叫:

proceduretfrmmain.button1click(sender: tobject);

var

r: trecord;

pr: precord;

begin

r.val := 10;

pr := @r;

r.getvalplus;

showmessage(inttostr(r.val));

showvalue(pr);

end;

蒼天啊,大地啊,終於看到跟c++中呼叫時一樣的效果了:

在此要特別感謝一下

maozefa

前輩(你的文章

給了我很大的啟發),雖然嘴巴特狠但心腸還算不錯的

老蔣,還有在暗暗給我鼓勁的

小13.......  

JS中函式的定義,函式宣告和帶參函式的宣告和呼叫

函式 function 又稱為方法 method 或過程 procedure 是一塊提前定義好的,並可以被反覆使用的 塊。其實函式就是乙個封裝 段的物件,函式名只是乙個引用物件的變數 函式是乙個引用型別的物件 語法 function 函式名 str.replace reg ig,function k...

C 函式指標的宣告與使用

一 函式指標是什麼 1.函式指標是指標 2.函式指標該如何宣告?我們可以和int型別的指標的宣告進行比對一下 宣告乙個int型指標 int p 宣告乙個函式型 假如是乙個有兩個int型別的引數以及乙個 int型別的返回值 的指標 int pfunc int,int 我們把指標名稱提出來看一下,整形指...

delphi 部分函式使用

function uppercase const s string string 說明 用於將 s 字串中的所有小寫字母轉化為大寫字母 其他字元不變 varsss string sss w 我的asdgh showmessage string.uppercase sss 結果 w 我的asdgh f...