調用DLL出錯(300分)

M

mild

Unregistered / Unconfirmed
GUEST, unregistred user!
我寫了一個dll文件,
在調用的時候經常會報錯.
Access Violation at address 0040445B in module 'Project1.exe'.Read of address 00F28DE8
請教各位,這是什麼原因,我該怎麼解決阿.
 
要根据写的原码分析
 
先把调用的一段贴出来看看
 
你输出的地址不存在,可能是dispose()了,最好贴出程序!大家分析分析……
 
检查一下你的DLL文件中是否使用了String 类型
如果使用了,则把project工程文件开头那段话看明白。
需要ShareMem放到开头的,而且发放程序的时候必须带上BORLNDMM.DLL
 
同意 only you
 
調用部分如下
implementation
{$R *.dfm}
function CheckValidBarCode(BarCode:pchar;var Msg:pchar;ICT_NO:pchar):integer;stdcall;external'fc/FCBarCode.dll';
procedure TForm1.Button3Click(Sender: TObject);
var ict_no,isn,msg:pchar;
ret:integer;
begin
isn:='CN07H373698611B91978';
ict_no:='0';
ret:=CheckValidBarCode(isn,Msg,ICT_NO);
if ret=1 then
memo1.Lines.add('OK>>'+Msg)
else
memo1.Lines.add('NG>>'+Msg)
end;
 
dll代碼
library部分:
library FCBarCode;
uses
ShareMem,
SysUtils,
Classes,
formUnit1 in 'formUnit1.pas' {OraForm};
{$R *.res}
exports
CheckValidBarCode;
begin
end.

Unit部分;
unit formUnit1;
interface
uses
ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Ora, DBAccess, DB, MemDS, IniFiles;
type
TOraForm = class(TForm)
OraSfis: TOraSession;
OraSPcekRoute: TOraStoredProc;
Qr_Device: TOraQuery;
end;
function CheckValidBarCode(BarCode:pchar;var Msg:pchar;ICT_NO:pchar):integer;stdcall;export;
implementation
{$R *.dfm}
function CheckValidBarCode(BarCode:pchar;var Msg:pchar;ICT_NO:pchar):integer;
var OraForm:TOraForm;
R:integer;
begin
try
oraForm:=TOraForm.Create(application.Owner);
with OraFormdo
begin
OraSPCekRoute.Close;
OraSPCekRoute.StoredProcName:='TSP_CHKROUTE';
OraSPCekRoute.Prepare;
OraSPCekRoute.ParamByName('P_Isn').AsString:=Ansiuppercase(barcode);
OraSPCekRoute.ParamByName('P_Dev').AsString:='0';
OraSPCekRoute.ExecProc;
msg:=pchar(OraSPCekRoute.ParamByName('P_Msg').AsString);
R:=OraSPCekRoute.ParamByName('P_ret').Asinteger;
OraSPCekRoute.Close;
end;
result:=R-1;
finally
oraForm.Free;
end;
end;
end.
 
Dear Only you;
BORLNDMM.DLL怎麼帶阿,要在代碼裡面作處理嗎,還是直接copy到目錄下就可以阿
 
先把数据库控件去掉,测试结果
 
這個報錯信息不是每次都有的,有時候有,有時候沒有.
 
我跟蹤過我的程序,調用dll的時候沒有報錯,錯誤是在訪問返回參數的時候發生的
 
是以下语句的问题:
msg:=pchar(OraSPCekRoute.ParamByName('P_Msg').AsString);
返回的这个地址,在EXE 中是无效的。
不要将 msg 声明为变参。
在调用前,对 msg 申请足够的空间,
比如: msg:char[0..255];
相应的把上面的语句改成如下形式:
strcopy(msg,pchar(OraSPCekRoute.ParamByName('P_Msg').AsString));
 
在function CheckValidBarCode(BarCode:pchar;var Msg:pchar;ICT_NO:pchar):integer;
中再定义一个变量sTmpMsg:string;
然后将msg:=pchar(OraSPCekRoute.ParamByName('P_Msg').AsString);
改为两句:sTmpMsg:=OraSPCekRoute.ParamByName('P_Msg').AsString;
msg:=pchar(sTmpMsg);
试一下。
 
to jsxjd
是不是把函數改成CheckValidBarCode(BarCode,Msg,ICT_NO:pchar):integer;
msg:char[0..255];的申明編譯無法通過阿

 
各位大哥幫幫忙,我再多出100分
 
應該是msg的錯誤
使用前分配內存.
 
Richard3000:
能說具體點嗎
 
用StrAlloc吧
如:msg:=StrAlloc(250+4);
看看help
 
感謝大家
 

Similar threads

顶部