在小組開發中,應用程式部分採用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...