我在用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(放在第一个),还是出错
请高手帮忙指点一下

解决方案 »

  1.   

    shareman这个单元貌似不能要
    砍掉,把输入输出的string类型都转换为PChar类型
      

  2.   

    谢谢楼上的帮忙 这确实是个IC卡读卡的程序我有试过 把所有string改为pchar 还是一样出错:调用ocx控件后弹出这个错误ICSeat是ocx控件大家帮忙啊
      

  3.   

    你的uses里面是不是有ShareMem这个单元?
      

  4.   

    有用shareMem 而且都放在第一个
      

  5.   

    在DLL里调用OCX时,应该在调用前调用ActiveX.OleInitialize(nil);
    而结束时调用ActiveX.OleUninitialize();
    最好的方法是新建一个单元,把该单元放在工程引用的最前边,然后在该单元中加入初始化节
    initialization
       ActiveX.OleInitialize(nil);
    finalization
       ActiveX.OleUninitialize();
      

  6.   

    那就把shareMem单元砍掉,不要了
    再运行程序试试
      

  7.   

    最好还是向厂家要Demo,然后按着Demo做。自己摸索,很难的。
      

  8.   

      
    initialization
      CoInitialize(nil);finalization 
      CoUninitialize;