头文件中的声明如下:
extern "C" __declspec(dllexport) char* GetErr(int ErrNo);
我的引入如下:
function GetErr(ErrNo: integer): PChar; stdcall; external DLL_NAME;写了一个函数封装一下:
function getError(ErrNo: integer): String;
begin
Result:= GetErr(ErrNo);
end;结果总是报access violation at 0xXXXXXXXXX:read of address 0xXXXXXXXXX的错误。为什么?
extern "C" __declspec(dllexport) char* GetErr(int ErrNo);
我的引入如下:
function GetErr(ErrNo: integer): PChar; stdcall; external DLL_NAME;写了一个函数封装一下:
function getError(ErrNo: integer): String;
begin
Result:= GetErr(ErrNo);
end;结果总是报access violation at 0xXXXXXXXXX:read of address 0xXXXXXXXXX的错误。为什么?
int GetErr(int ErrNo, char** Msg);引入:
function GetErr(ErrNo: Integer; Msg: string): Integer;使用:
var
Msg: string;
begin
SetLength(Msg, 100);
if GetErr(ErrNo, Msg) = 1 then
...
end;
function GetErr(ErrNo: Integer; var Msg: string): Integer;
出现access violation at 0xXXXXXXXXX:read of address 0xXXXXXXXXX的错误
如果X为0,就是空指针调用;如果X大于0,就是指针已被释放,或者尚未分配
1 function getError(ErrNo: integer): String;
2 var p: PChar;
3 begin
4 p:= GetErr(ErrNo);
5 Result:= StrPas(p);
6 end;在5设了断点,可以看到p里面是有值的。但这样还是出错。我后来干脆这么写了,还是不行。
function getError(ErrNo: integer): String;
var tmp: array of Char;
p: PChar;
i,len: Integer;
begin
p:=GetErr(isNo);
len:= StrLen(p);
SetLength(tmp,len);
StrMove(@tmp[0],p,len);
for i:=0 to len-1 do
Result:= Result+tmp[i];
end;
[email protected]
function StrPas(const Str: PChar): string;
begin
Result := Str;
end;
重函数原型看,如果提供的dll没有问题的情况下,该函数没有空间分配问题。最多也只能看看返回是否为NIL
我同事在声明的时候用了stdcall,如果不声明stdcall调用的时候会经常出问题的。
你查查VC代码啊