简单DLL问题 (150分)

  • 主题发起人 主题发起人 PLWang
  • 开始时间 开始时间
P

PLWang

Unregistered / Unconfirmed
GUEST, unregistred user!
调用的时候总产生一个写错误 Access Violation at address... in Module 'DecodeDLL.dll' .Write of address 00000000
library DecodeDll;
uses
ShareMem,
SysUtils,
Classes;

{$R *.res}
function checknumber(const s : string): string;
...
function CHDecode(var s : string): String;
...
function GetInfo(original, PhoneNumber, content : PChar): LongBool; stdcall;
var str : string;
numberlen : integer;
begin
str := String(original);
if Length(str)<30 then Result := False;
numberlen := strtoint('$'+Copy(str,23,2));
if (numberlen mod 2)=0 then begin
StrCopy(PhoneNumber,PChar(checknumber(Copy(str,27,numberlen))));
Delete(str,1,26+numberlen);
end else begin
StrCopy(PhoneNumber,PChar(checknumber(Copy(str,27,numberlen+1))));
Delete(str,1,26+numberlen+1);
end;
Delete(str,1,8);
StrCopy(content,PChar(CHDecode(str)));
Result:= True;
end;
exports
GetInfo;

end.
调用部分:
function GetInfo(original, PhoneNumber, content : PChar): LongBool; stdcall;
external 'DecodeDll.dll'
procedure TForm1.Button1Click(Sender: TObject);
var str : String;
pnum : array[0..18] of char;
pcontent : array[0..256] of char;
begin
str := 'E901A002C655980B25B6696628FD900.........................................';
if GetInfo(PChar(str),pnum,pcontent) then
edit1.Text := string(pnum)+'>'+string(pcontent);
end;
 
我今天也遇到了同样的问题,不知道该怎么办
 
怎么没人看啊 up
 
调用没问题,还是调是一下函数吧!
 
如果你的dll中的两个未知函数我把他默认为
function checknumber(const s : string): string;
begin
result:=s;
end;

function CHDecode(var s : string): String;
begin
result:=s;
end;
而且str中的字符数不能太多调用通过了
如果str中的字符太多报错
排除str的长度问题那就是你的dll中的程序有问题。
同意 人在昆明 的意见调用没问题,还是调是一下函数吧!
 
参数超长是有可能的 比如 str := String(original);
刚才试了一下 比如 str : AnsiString;
str := 'aaaaaaaaaaaaaaaaaaaaaaaaaa..........................................';
当里面的长度超过255时一样通不过 只能在其间加几个'+' 这怎么和帮助上的解释不一样呢
Type Maximum length
ShortString 255 characters
AnsiString ~2^31 characters
 
看上去程序好像没问题,你干吗不设个断点跟踪一下?另外既然用了ShareMem,干吗还要
pchar、string转来转去的,直接用string错误的机会要小的多。
 
用PChar是因为这个DLL最终要用一个VC的程序来调 据说用string以后问题会比较多
 
好像dll 里面尽量不要用 string,据说要带着一个包走。
 
string好像是有点问题,我以前也碰到过
你可以这样试试,先把DLL中的程序取出来,作为一个函数或过程调试,看看没有问题
 
多人接受答案了。
 

Similar threads

后退
顶部