调用其他语言dll出现access violation ataddress问题

默__ 2013-06-28 08:44:29
公司给出的接口说明
读二代身份证
原型: int ReadCard(char *Name,
char *Sex,
char *Nation,
char *Birthday,
char *Address,
char *ID,
char *Department,
char *StartDate,
char *EndDate,
char *Reserve,
char *AppAddress1,
char *PhotoData)
参数: Name 姓名
Sex 性别
Nation 民族
Birthday 生日
Address 住址
ID 身份证号
Department 发证机关
StartDate 起始日期
EndDate 终止日期
Reserve 预留信息
AppAddress1 预留地址
PhotoData 照片信息
返回:
=0 成功
<0 失败
程序如下
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
OpenCom = function (Comport:integer;Baud:integer):integer;stdcall;
SelModule = function (PortType:integer;Module:integer):integer;stdcall;
CloseCom = function ():integer;stdcall;
ReadCard = function (Name:pChar;Sex:pChar;Nation:pChar;Birthday:pChar;
Address:pChar;ID:pChar;Department:pChar;StartDate:pChar;EndDate:pChar;
Reserve:pChar;AppAddress1:pChar;PhotoData:pChar):integer;stdcall;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var DllHandle:THandle;
ComPort,Baud,HBaud,result:integer;
PortType,Module:integer;
sfzName,sfzSex,sfzNation,sfzBirthday,sfzAddress,sfzID,sfzDepartment,
sfzStartDate,sfzEndDate,sfzReserve,sfzAppAddress1,sfzPhotoData:string;
oc:OpenCom;
sm:SelModule;
cc:CloseCom;
rc:ReadCard;
begin

ComPort:=1;Baud:=9600;HBaud:=115200;result:=22;
PortType:=0;Module:=3;

DLLHandle:=LoadLibrary('JCJP_API.dll');
if DLLHandle<>0 then
begin
@oc:=GetProcAddress(DllHandle,'Open_Com');

if @oc<>nil then
begin
if( oc(ComPort,Baud) = 0 )then
begin
@sm:= GetProcAddress(DllHandle,'Sel_Module');
if @sm<>nil then
begin
if(sm(PortType,Module) = 0)then
begin
@cc:= GetProcAddress(DllHandle,'Close_Com');
if( cc()=0)then
begin
@oc:=GetProcAddress(DllHandle,'Open_Com');
if(@oc<>nil)then
begin
if(oc(ComPort,HBaud)=0)then
begin
@rc:= GetProcAddress(DllHandle,'ReadCard');
if @rc<>nil then
begin
try
if(rc(@sfzName,@sfzSex,@sfzNation,@sfzBirthday,@sfzAddress,@sfzID,@sfzDepartment,
@sfzStartDate,@sfzEndDate,@sfzReserve,@sfzAppAddress1,@sfzPhotoData)=0)then
begin
// showmessage(sfzID);
showmessage('222'+sfzName);
showmessage('222');
end
else
begin
showmessage('没有找到二代身份证,读取失败!');
end;
except
on E:exception do
showmessage(e.Message);
end;
result:=sm(PortType,0);
result:=cc();
end
else
showmessage('rc is nil');
end
else
showmessage('高频打开串口失败');
end
else
showmessage('oc is nil');
end
else
showmessage('关闭串口失败');
end
else
begin
showmessage('选择模式失败');
end;
end
else
begin
showmessage('sm is nil');
end;
end
else
showmessage('串口打开失败!');
end
else
showmessage('oc is nil');
end
else
showmessage('222');
FreeLibrary(DLLHandle);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;


end.

-----------------------------------------
把下面这句删掉一切正常。
rc( sfzName,@sfzSex,@sfzNation,@sfzBirthday,@sfzAddress,
@sfzID,@sfzDepartment,@sfzStartDate,@sfzEndDate,@sfzReserve,
@sfzAppAddress1,@sfzPhotoData)=0
请高手帮忙look look
...全文
736 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
默__ 2013-06-28
  • 打赏
  • 举报
回复
结束按钮事件的时候弹出上面的框框。
默__ 2013-06-28
  • 打赏
  • 举报
回复
引用 10 楼 gxgyj 的回复:
多设断点,仔细看,是在哪报错 慢慢来吧
调试到最后,好像到也没有错。 是不是需要释放什么?
gxgyj 2013-06-28
  • 打赏
  • 举报
回复
多设断点,仔细看,是在哪报错 慢慢来吧
默__ 2013-06-28
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
OpenCom = function (Comport:integer;Baud:integer):integer;stdcall;
SelModule = function (PortType:integer;Module:integer):integer;stdcall;
CloseCom = function ():integer;stdcall;
ReadCard = function (Name,Sex,Nation,Birthday,Address,ID,Department,
StartDate,EndDate,Reserve,AppAddress1,PhotoData:PAnsiChar):integer;stdcall;

TIDCardInfo=record
_Name:array[1..31] of AnsiChar;
_Sex:array[1..3] of AnsiChar;
_Nation:array[1..51] of AnsiChar;
_Birthday:array[1..9] of AnsiChar;
_Address:array[1..51] of AnsiChar;
_ID:array[1..19] of AnsiChar;
_Department:array[1..51] of AnsiChar;
_StartDate:array[1..9] of AnsiChar;
_EndDate:array[1..9] of AnsiChar;
_Reserve:array[1..51] of AnsiChar;
_AppAddress1:array[1..51] of AnsiChar;
_PhotoData:array[1..51] of AnsiChar;
Freadinfo:Integer; //读卡状态
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var DllHandle:THandle;
ComPort,Baud,HBaud,result:integer;
PortType,Module:integer;
oc:OpenCom;
sm:SelModule;
cc:CloseCom;
rc:ReadCard;
idci:TIDCardInfo;
begin

ComPort:=1;Baud:=9600;HBaud:=115200;result:=22;
PortType:=0;Module:=3;

DLLHandle:=LoadLibrary('JCJP_API.dll');
if DLLHandle<>0 then
begin
@oc:=GetProcAddress(DllHandle,'Open_Com');

if @oc<>nil then
begin
if( oc(ComPort,Baud) = 0 )then
begin
@sm:= GetProcAddress(DllHandle,'Sel_Module');
if @sm<>nil then
begin
if(sm(PortType,Module) = 0)then
begin
@cc:= GetProcAddress(DllHandle,'Close_Com');
if( cc()=0)then
begin
@oc:=GetProcAddress(DllHandle,'Open_Com');
if(@oc<>nil)then
begin
if(oc(ComPort,HBaud)=0)then
begin
@rc:= GetProcAddress(DllHandle,'ReadCard');
if @rc<>nil then
begin
idci.Freadinfo:=rc(@idci._Name,@idci._Sex,@idci._Nation,
@idci._Birthday,@idci._Address,@idci._ID,@idci._Department,
@idci._StartDate,@idci._EndDate,@idci._Reserve,@idci._AppAddress1,
@idci._PhotoData);
showmessage('没有找到二代身份证,读取失败!');


result:=sm(PortType,0);
result:=cc();
end
else
showmessage('rc is nil');
end
else
showmessage('高频打开串口失败');
end
else
showmessage('oc is nil');
end
else
showmessage('关闭串口失败');
end
else
begin
showmessage('选择模式失败');
end;
end
else
begin
showmessage('sm is nil');
end;
end
else
showmessage('串口打开失败!');
end
else
showmessage('oc is nil');
end
else
showmessage('222');
FreeLibrary(DLLHandle);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;


end.

改造完毕,读取二代证结果正常。
但是运行完毕
显示

不知道怎么做了?

谢谢楼上的兄弟姐妹们。
gxgyj 2013-06-28
  • 打赏
  • 举报
回复
意思是你声明的方式不对,参照楼上的来声明
默__ 2013-06-28
  • 打赏
  • 举报
回复
4楼的程序俺看不懂,请大侠指点一下,谢谢。
BlueEnchanter 2013-06-28
  • 打赏
  • 举报
回复
4楼的方法应该可以。出错的原因应该是你没分配内存空间,可以用4楼这种静态分配好的,或者程序里动态分配内存
火龙岛主 2013-06-28
  • 打赏
  • 举报
回复
直接声明:
var
    sfzName,sfzSex,sfzNation,sfzBirthday,sfzAddress,sfzID,sfzDepartment,
    sfzStartDate,sfzEndDate,sfzReserve,sfzAppAddress1,sfzPhotoData:pchar;
这个地方: ReadCard = function (var Name:pChar;var Sex:pChar;var Nation:pChar;var Birthday:pChar; var Address:pChar;var ID:pChar;var Department:pChar;var StartDate:pChar;var EndDate:pChar; var Reserve:pChar;var AppAddress1:pChar;var PhotoData:pChar):integer;stdcall;
gxgyj 2013-06-28
  • 打赏
  • 举报
回复
定义sfzName等参照如下,试试 我的方法

function ReadBaseInfosPhoto(Name,Sex,Folk,BirthDay,ID,Address,Issue,dBegin,dEnd,Photopath:PAnsiChar):integer;stdcall;External '.\dll\sdtapi.dll';


type
  TIDCardInfo=record
    _Name:array[1..31] of AnsiChar;
    _Sex:array[1..3] of AnsiChar;
    _Folk:array[1..10] of AnsiChar;
    _Birthday:array[1..9] of AnsiChar;
    _Addr:array[1..71] of AnsiChar;
    _ID:array[1..19] of AnsiChar;
    _Issue:array[1..31] of AnsiChar;
    _dBegin:array[1..9] of AnsiChar;
    _dEnd:array[1..9] of AnsiChar;
  private
    Fport:Integer;         //端口状态
    Fauthenticate:Integer; //认证状态
    Freadinfo:Integer;     //读卡状态
  end;


ReadCard.Freadinfo:=ReadBaseInfosPhoto(@ReadCard._Name,@ReadCard._Sex,@ReadCard._Folk,@ReadCard._Birthday,@ReadCard._ID,@ReadCard._Addr,@ReadCard._Issue,@ReadCard._dBegin,@ReadCard._dEnd,PAnsiChar(AnsiString(Fphotopath)));
默__ 2013-06-28
  • 打赏
  • 举报
回复
引用 2 楼 feiba7288 的回复:
试下修改成如下: if(rc(PChar(sfzName),PChar(sfzSex),PChar(sfzNation),PChar(sfzBirthday),PChar(sfzAddress),PChar(sfzID),PChar(sfzDepartment), PChar(sfzStartDate),PChar(sfzEndDate),PChar(sfzReserve),PChar(sfzAppAddress1),PChar(sfzPhotoData))=0)then
按照上面提示修改。现在提示 Project Project1.exe raised exception class EaccessViolation with message 'Access violation at address 1000511B in module 'JCJP_AP'.Write of address 00404311' Process stopped.Use Step or Run to continue.
feiba7288 2013-06-28
  • 打赏
  • 举报
回复
试下修改成如下: if(rc(PChar(sfzName),PChar(sfzSex),PChar(sfzNation),PChar(sfzBirthday),PChar(sfzAddress),PChar(sfzID),PChar(sfzDepartment), PChar(sfzStartDate),PChar(sfzEndDate),PChar(sfzReserve),PChar(sfzAppAddress1),PChar(sfzPhotoData))=0)then
默__ 2013-06-28
  • 打赏
  • 举报
回复

运行后错误提示。
神马豆是浮云 2013-06-28
  • 打赏
  • 举报
回复
我也曾经碰到过这个问题,运行时设置兼容模式即可。
内容概要:本文介绍了如何利用 GitHub Copilot 辅助进行程序调试与 Bug 分析,强调 Copilot 不仅可用于代码生成,更是强大的代码分析与调试工具。文章详细阐述了 Copilot 在调试复杂问题、老旧项目维护和难以复现 Bug 场景下的优势,提出了“先分析、再修改”的四步流程:分析原因→评估风险→提出方案→修改代码,并推荐结合错误日志、用户操作等信息精准提问,提升 AI 回答质量。同时展示了如何通过 Copilot 增强调试能力,如自动加日志、异常保护、生成测试数据和性能分析。最后通过游戏拾取系统的实际案例,说明如何结构化描述问题以获得有效反馈。; 适合人群:具备一定开发经验,正在参与项目调试或维护工作的程序员,尤其是面对复杂逻辑、历史代码或难复现 Bug 的 1-3 年开发者;也适合希望提升 AI 协作能力的技术人员。; 使用场景及目标:①快速定位偶发性崩溃、数据异常等问题根源;②理解无文档或结构混乱的老代码模块;③优化调试流程,借助 AI 生成诊断建议、修复方案与测试用例;④构建更具健壮性的程序,提前发现潜在缺陷。; 阅读建议:学习者应结合自身项目中的真实问题,按照文中提供的结构化提问模板实践,逐步训练与 Copilot 的协作能力,重视问题描述的完整性与准确性,避免直接要求修改代码,优先通过分析提升对系统的理解。
内容概要:本文针对高精度电流控制下的永磁同步电机(PMSM)参数辨识难题,提出一种基于粒子群优化算法(PSO)的多参数辨识模型,并在Simulink环境中完成系统级仿真实现。研究旨在克服传统控制中因电机参数(如定子电阻、交直轴电感、永磁磁链等)随温度、负载变化而失配所导致的电流控制性能下降问题。通过构建以电流跟踪误差为核心的适应度函数,利用PSO算法全局寻优能力强的特点,实现对关键电机参数的在线或离线精确辨识。文中详述了PSO算法的实现机制、参数初始化策略、收敛判据设计以及与PMSM矢量控制系统的集成方法,验证了该方案在不同运行工况下的辨识精度、收敛速度与鲁棒性,显著提升了电流环的动态响应品质与稳态控制精度。; 适合人群:具备电机驱动控制、现代控制理论及优化算法基础,熟悉MATLAB/Simulink仿真平台,从事高性能PMSM控制系统研发的研究生、高校科研人员及自动化、电力电子领域的工程师;特别适合正在开展参数自适应、智能控制算法应用等相关课题的研究者。; 使用场景及目标:①应用于高端制造装备、电动汽车驱动系统、精密伺服系统等对电流控制精度要求严苛的场合;②解决实际工程中因电机温升、老化等因素引发的参数漂移问题,提升系统长期运行稳定性;③作为智能优化算法与电机控制深度融合的教学案例,帮助理解PSO在复杂非线性系统参数辨识中的应用逻辑与实现路径。; 阅读建议:建议读者结合提供的Simulink仿真模型进行复现实验,重点剖析PSO算法模块与电机控制模型的接口设计、适应度函数的构建原则及参数敏感性分析方法,可进一步尝试引入其他先进优化算法(如GWO、HHO)进行性能对比,以深入掌握不同智能算法在工程辨识问题中的适用性与优劣。

16,741

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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