delphi寫了個dll其中一個方法:
function CAM_GrabImage(var devId:WideString;out imageData:Pointer;out imageSize:Int64; out imageWidth:Integer; out imageHeight:Integer) : integer ; cdecl ;
用delphi撰寫的程式呼叫的時候 imageData 正常回傳了指標。
用C++呼叫的時候 imageData地址變成了null。其他引數都正常回傳。
有人遇到并解決過類似情況嗎?
下面是C呼叫部分代碼,沒有例外。就是imageData在debug時候看是null。傳進去的時候還有初始地址,運行結束后變null。
typedef __cdecl int(*Dllfun)(char* devId, char* imageData,long* imageSize,int* imageWidth, int* imageHeight);
result = CAM_GrabImage(devId,imageData,imageSize,imageWidth,imageHeight);
delphi中
imageData:Pointer 我試過PChar
C中
Char* void*都試過。
結果一樣,都是delphi撰寫的代碼呼叫dll正常回傳,C呼叫同一個dll,不正常。
請不吝賜教,感謝。
uj5u.com熱心網友回復:
imageData:Pointer 這個里面的資料是X,Y不是但一個變數。
uj5u.com熱心網友回復:
Pointer 是無型別指標,坐標結構是TPoint。out關鍵字修飾的引數只能接受輸出值,不能輸入。PChar對應Char*,Pointer對應void*沒有問題。但imageData可能是Delphi專用的型別物件,如果是,通常不能傳遞到C/C++中使用。dll傳遞引數應該用通用的基本型別或結構型別。uj5u.com熱心網友回復:
function CAM_GrabImage(var devId:WideString;out imageData:Pointer;out imageSize:Int64; out imageWidth:Integer; out imageHeight:Integer) : integer ; cdecl ;和
typedef __cdecl int(*Dllfun)(char* devId, char* imageData,long* imageSize,int* imageWidth, int* imageHeight);
對不上啊。
首先WideString應該是wchar_t*,var devId:WideString就應該是wchar_t**,其次Int64應該用long long或者__int64,另外所有的out引數都是變參,要傳參考。
typedef __cdecl int(*Dllfun)(wchar_t** devId, char** imageData, long long * imageSize, int* imageWidth, int* imageHeight);
uj5u.com熱心網友回復:
你的引數有問題,直接使用指標傳不行嗎如果不行你試試換一下引數傳遞方式
uj5u.com熱心網友回復:
我字串從來都是定義成Pchar或Pwidechar,沒有試過直接用string,widestringuj5u.com熱心網友回復:
uj5u.com熱心網友回復:
關于DLL的呼叫 ,,,尤其是指標資料,主要問題是空間分配的問題。你imagedata的資料空間,是在delphi中getmem分配出來的么?另外你這種呼叫方法,,分配出來的imagedata資料區,要保證是長期存在的,不能洗掉。uj5u.com熱心網友回復:
寫這dll的技術不過關呀,給delphi,cbc呼叫,string,widestring還可以用,要通用,最好pchar,pwidechar,不在dll里改,你是很難用好的轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49275.html
上一篇:急求:delphi7呼叫webservice 編譯時報錯 :[Fatal Error] Internal error: L3169
