在Dll中调用ocx出错

eagleldj 2008-07-01 04:16:44
我在用delphi写的dll中调用了ocx控件,dll的导出函数用到了widestring
Dll入口函数
procedure DLLEntryPoint(dwReason: DWord);stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
CoInitialize(NIL);
ICSeat:= CreateOleObject('ICC.IC_S') as IC_Seat;
end;
DLL_PROCESS_DETACH:
begin
CounInitialize;
end;
DLL_THREAD_ATTACH: ;
DLL_THREAD_DETACH: ;
end;
end;

两个导出函数
function Ding_Ring(DR_Port_Com: Smallint; DR_Num: Byte; DR_Time: Byte): Smallint; stdcall;
begin
result := ICSeat.Ding_Ring(DR_Port_Com, DR_Num, DR_Time);
//这句可以调用 但返回的时候出错 too many consecutive exceptions 'access violation at 0x.....
end;

function Read_Card(RC_Port_Com: Smallint; var RC_Str_Card: WideString): Smallint; stdcall;
begin
result := ICSeat.Read_Card(RC_Port_Com, RC_Str_Card);
end;

调用任何一个使用了ICSeat的导出函数都会出错
too many consecutive exceptions 'access violation at 0x.....

原本怀疑是dll导出函数的参数用了string的原因
后 在dll的project文件及测试dll的exe文件都有调用SharMem(放在第一个),还是出错
请高手帮忙指点一下

...全文
377 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Reverse.King 2008-07-07
  • 打赏
  • 举报
回复

initialization
CoInitialize(nil);

finalization
CoUninitialize;
linjunmo120 2008-07-02
  • 打赏
  • 举报
回复
在DLL里调用OCX时,应该在调用前调用ActiveX.OleInitialize(nil);
而结束时调用ActiveX.OleUninitialize();


最好的方法是新建一个单元,把该单元放在工程引用的最前边,然后在该单元中加入初始化节
initialization
ActiveX.OleInitialize(nil);
finalization
ActiveX.OleUninitialize();
eagleldj 2008-07-02
  • 打赏
  • 举报
回复
有用shareMem 而且都放在第一个
踢踏 2008-07-02
  • 打赏
  • 举报
回复
最好还是向厂家要Demo,然后按着Demo做。

自己摸索,很难的。
gyk120 2008-07-02
  • 打赏
  • 举报
回复
那就把shareMem单元砍掉,不要了
再运行程序试试
gyk120 2008-07-01
  • 打赏
  • 举报
回复
你的uses里面是不是有ShareMem这个单元?
eagleldj 2008-07-01
  • 打赏
  • 举报
回复
谢谢楼上的帮忙 这确实是个IC卡读卡的程序

我有试过 把所有string改为pchar 还是一样出错:调用ocx控件后弹出这个错误

ICSeat是ocx控件

大家帮忙啊
gyk120 2008-07-01
  • 打赏
  • 举报
回复
shareman这个单元貌似不能要
砍掉,把输入输出的string类型都转换为PChar类型
yangkunjie 2008-07-01
  • 打赏
  • 举报
回复
好像是一个IC卡读卡的东东
常见的内存地址访问错误
希望楼主能够描述的再详细一点

1,183

社区成员

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

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