看看我的程序代码出现什么问题?特急!!!!

luckyboy21c 2003-01-08 05:47:14
下面的代码为调用dll(驱动扫描仪,扫描发票,然后识别成文字)在第一次调用时可以扫描识别,但是再次点击扫描按钮时,整个程序自动退出,请问各位怎么办?特急!
procedure Tmainform.N9Click(Sender: TObject);
type
TIntFunc=function(i:pchar):integer;stdcall;
var
Th:Thandle;
Tf1,Tf2:TIntFunc;
Tp1,Tp2:TFarProc;
lib:string;
Scanner,filepath:pchar;
//sd:array[1..19] of char;
dwRetn:integer;
begin
//showmessage(' 扫描前请先装入发票!');
lib:=p_path+'\EtcVatScan.dll';
Th:=LoadLibrary(pchar(lib)); {装载DLL}
if Th>0 then
try
Tp1:=GetProcAddress(Th,PChar('C_getScanner')); //获取扫描仪类型
Tp2:=GetProcAddress(Th,PChar('C_getetcvatfile'));//指令扫描仪进行扫描识别,并返回最后的识别文本文件ETCVAT.TXT全路径。
if (Tp1<>nil) and (Tp2<>nil) then
if Tp1<>nil then
begin
Tf1:=TIntFunc(Tp1);
GetMem(Scanner,60);//为将要得到的名字分配内存
dwRetn := Tf1(Scanner);
showmessage(string(Scanner)+'as:'+inttostr(dwRetn));
FreeMem(Scanner,0); // 释放分配的内存
if dwRetn=1 then
begin
GetMem(filepath,200);
Tf2:=TIntFunc(Tp2);
dwRetn := Tf2(filepath);
if dwRetn=0 then
showmessage(string(filepath)+'as:'+inttostr(dwRetn))
else
showmessage('as:'+inttostr(dwRetn));
FreeMem(filepath,0); // 释放分配的内存
end;
end
else
ShowMessage('C_getScanner函数没有找到');
finally
FreeLibrary(Th); //释放DLL
end
else
ShowMessage('扫描库'+lib+'未找到,加载不成功!');
end;
...全文
44 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
王集鹄 2003-01-09
  • 打赏
  • 举报
回复
//....
interface
//....
function C_getScanner(I: PChar): Integer; stdcall; external 'EtcVatScan.dll';
function C_getetcvatfile(I: PChar): Integer; stdcall; external 'EtcVatScan.dll';
//....
implementation
//....
//使用静态方法
zhang21cnboy 2003-01-09
  • 打赏
  • 举报
回复
我认为问题在这里
lib:=p_path+'\EtcVatScan.dll';
Th:=LoadLibrary(pchar(lib)); {装载DLL}

第二次的时候因为p_path改变了,所以没有找到dll,所以。。。。。。。。

哈哈,仅仅是一个猜测了!别见怪,我老人家懒的调试!
luckyboy21c 2003-01-09
  • 打赏
  • 举报
回复
还是有错误
luckyboy21c 2003-01-08
  • 打赏
  • 举报
回复
还是不可以,我已经测试多次,第一次运行可以,第二次再按扫描按钮就会出现问题,如果我把是最后的FreeLibrary(vHandle)去掉就可以。这样做有什么弊端?请各位高手指点!谢谢!还有没有其他方法??
jlj_jill 2003-01-08
  • 打赏
  • 举报
回复
应该是内存越界的问题,你改动一下试试
vReturn := C_getScanner(@vScanner[0]);
vReturn := C_getetcvatfile(@vfilepath[0]);
luckyboy21c 2003-01-08
  • 打赏
  • 举报
回复
我调试楼上的代码,是最后的FreeLibrary(vHandle),出现问题!
ccc_wh 2003-01-08
  • 打赏
  • 举报
回复
你单步调试一下嘛
王集鹄 2003-01-08
  • 打赏
  • 举报
回复
//不要着急,一步一步调试~~
//没有设备,帮不了你调试!~~
//随便写了段代码,随便试试~~
//就当up一下
type
TIntFunc = function(I: PChar): Integer; stdcall;
var
vHandle: THandle;
C_getScanner, C_getetcvatfile: TIntFunc;
vScanner: array[0..60] of Char;
vFilePath: array[0..MAX_PATH] of Char;
vReturn: Integer;
vLibFile: TFileName;
begin
vLibFile := p_path + '\EtcVatScan.dll';
vHandle := LoadLibrary(PChar(vLibFile)); //装载DLL
if vHandle <= 0 then begin
ShowMessage('扫描库 ' + vLibFile + ' 未找到,加载不成功!');
Exit;
end;
try
@C_getScanner := GetProcAddress(vHandle, PChar('C_getScanner'));
if not Assigned(@C_getScanner) then begin
ShowMessage('C_getScanner函数没有找到');
Exit;
end;
@C_getetcvatfile := GetProcAddress(vHandle, PChar('C_getetcvatfile'));
if not Assigned(@C_getetcvatfile) then begin
ShowMessage('C_getetcvatfile函数没有找到');
Exit;
end;
vReturn := C_getScanner(vScanner);
if vReturn <> 1 then Exit;
ShowMessage(vScanner + ' as:' + IntToStr(vReturn));
vReturn := C_getetcvatfile(vfilepath);
if vReturn = 0 then
ShowMessage(vFilePath + ' as:' + IntToStr(vReturn))
else ShowMessage('as:'+inttostr(vReturn));
finally
FreeLibrary(vHandle); //释放DLL
end
end;
luckyboy21c 2003-01-08
  • 打赏
  • 举报
回复
没有提示,程序自动退出!
Billy_Chen28 2003-01-08
  • 打赏
  • 举报
回复
提示什么错误?

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧