delphixe3呼叫C語言開發的dll介面中引數之間資料型別轉換及處理
寫這篇部落格的原因:之前我是用delphi7開發,在呼叫c版的dll介面時從沒有出現過問題,後來升級為delphixe3版本開發時,出現一些令人頭疼的問題,我費了很大勁才解決。
Delphixe3出現如下問題:
舉個例子:dll檔案介面定義如下
int testDLLfun(unsigned char*a,unsigned long aLen, unsigned char* b, unsigned long * bLen);
當Delphi呼叫該函式時,若在delphi7中char*對應的是pchar型別(delphi7中預設的pchar就是PAnsichar型別),而從delphi2010版本以上pchar型別預設指的是PWidechar,因此在delphixe3中我們要定義成PAnsichar型別,在這裡我用的是靜態呼叫dll的方式。
function testDLLfun(a:PAnsiChar;aLen:Integer; b:PAnsiChar;bLen:pInteger):Integer;stdcall; external'dllName.dll' name 'testDLLfun';
具體實現呼叫delphi中的testDLLfun方法如下
function test(const aStr: AnsiString): String;
var aStr1:AnsiString;
bLen,retcode:Integer;
b:PAnsiChar;
bMemoryStream:TMemoryStream;
aBytes:TBytes;
begin
bMemoryStream:=TMemoryStream.Create;
try
bLen:=2048;
SetLength(aBytes,1024);
aBytes:= DecodeBase64(aStr);//base64解碼
SetString(aStr1,PAnsiChar(aBytes),length(aBytes));//將解碼的位元組陣列轉成字串
GetMem(b, bLen);
retcode:=testDLLfun(PAnsiChar(aStr1),Length(aStr1),b,@bLen);
bMemoryStream.Write(b^,blen);//將dll介面中的輸出引數寫入流裡作為返回值輸出
bMemoryStream.Position:=0;
Result:= bMemoryStream.DataString;
finally
Finalize(aBytes);
FreeMem(b);
bMemoryStream.Free;
end;
end;
由於我實現的功能中必須要經過base64解碼後的引數傳入testDLLfun中,我試了多種的delphi中自帶的解碼方法,出現亂碼或字元長度不對的問題,導致呼叫testDLLfun失敗,經過測試,只有DecodeBase64方法是可以成功,先轉成位元組陣列,在轉成string,但具體的原因我也解釋不清,如果大家知道原因的,歡迎指教。
第一次發博,如有表達的不對或者想的不周到的,歡迎大家指出,我們一起進步。
相關文章
- C語言“字串-數字”之間的轉換C語言字串
- go語言資料型別轉換Go資料型別
- Java 資料型別之間的轉換Java資料型別
- C++基本資料型別及型別轉換C++資料型別
- SQL資料型別和C#資料型別間的轉換SQL資料型別C#
- C語言的隱式型別轉換C語言型別
- C語言-變數常量資料型別C語言變數資料型別
- 7.GoLang中基本資料型別之間的轉換Golang資料型別
- C語言第三篇:C語言資料型別及各資料型別所佔記憶體位元組數C語言資料型別記憶體
- C語言資料型別C語言資料型別
- C語言資料型別、變數的輸入和輸出、進位制轉換C語言資料型別變數
- 5.JavaScript資料型別之間的轉換JavaScript資料型別
- 資料型別及轉換資料型別
- c語言的基本資料型別C語言資料型別
- Java資料型別及型別轉換Java資料型別
- C語言(基本資料型別)C語言資料型別
- 【揭祕】C語言型別轉換時發生了什麼?C語言型別
- C語言型別轉換大學霸IT達人C語言型別
- 【C++注意事項】1 資料型別及型別轉換C++資料型別
- 在Windows Phone專案中呼叫C語言DLLWindowsC語言
- C語言資料型別和算數運算C語言資料型別
- C# 泛型中的資料型別判定與轉換C#泛型資料型別
- C語言中資料型別的自動型別轉換C語言資料型別
- 換個角度帶你學C語言的基本資料型別C語言資料型別
- NodeJS 和 C++ 之間的型別轉換NodeJSC++型別
- js資料型別間的互相轉換JS資料型別
- IOS開發語言Swift入門連載---型別轉換iOSSwift型別
- C語言 列舉資料型別C語言資料型別
- c語言是如何處理函式呼叫的?C語言函式
- Golang語言包-字串處理strings和字串型別轉換strconvGolang字串型別
- c語言運算過程中的型別自動轉換原則C語言型別
- c語言中的資料型別的自動轉換原則C語言資料型別
- 強型別語言變數和資料型別的理解變數資料型別
- java語言操作Oracle資料庫中的CLOB資料型別 (轉)JavaOracle資料庫資料型別
- C++中的向上型別轉換和向下型別轉換C++型別
- Javascrip 之 字串處理 & 定時器 & 型別轉換Java字串定時器型別
- 遊戲開發中的多語言處理遊戲開發
- JNI開發流程與引用資料型別的處理資料型別