自己编写的ActiveX控件出了点问题,请指教~!:其他公司提供的DLL,里面有一读卡函数
原型:
 int  ReadCard(int ReadType=9, int RecordId=1, char* DataBuffer);我在Delphi里定义为
const
  DllName='DBLib2.dll';
  Function ReadCard(ReadType:Integer; RecordId:Integer; DataBuffer:PChar):Integer;{stdcall;}stdcall;external DllName;然后建立一类进行封装
TLnHisObj = class(TObject)
private
  fDataBuffer: PChar;  
public
  constructor Create;
  Function VbReadCard():Integer;
end;constructor TLnHisObj.Create;
begin
  inherited;
  GetMem(fDataBuffer,1024);
end;function TLnHisObj.VbReadCard: Integer;
begin
  result := ReadCard(9, 1, fDataBuffer);
end;然后创建一ActiveForm控件进行包装
TLnHis = class(TActiveForm, ILnHis)
  procedure ActiveFormCreate(Sender: TObject);
private
    FEvents: ILnHisEvents;
    fLnHisObj : TLnHisObj;  
    procedure BeforeFree;
protected
  function VbReadCard: Integer; safecall;
end;procedure TLnHis.ActiveFormCreate(Sender: TObject);
begin
  fLnHisObj := TLnHisObj.Create;
end;procedure TLnHis.BeforeFree;
begin
  fLnHisObj.free;
end;function TLnHis.VbReadCard: Integer;
begin
  Result := fLnHisObj.VbReadCard;
end编译OCX,注册,在HTM里测试时,执行VbReadCard就报错,内存错误,看不懂哪里出错了?
把fDataBuffer改为一维固定1024长度Char数组也不行。可是我做了另一个EXE,测试TLnHisObj类的实例对象的读卡VbReadCard函数是成功的,郁闷了!!请大家指点~!!

解决方案 »

  1.   

    DBLib2.dll 的目录在哪?试试放到 windows\system32目录下。
      

  2.   

    已经在system32目录下了啊。关键是调用DLL后无法返回,IE里无法获取返回值
      

  3.   

    delphi调试IE的,你可以在执行代码的地方设置断点。然后运行IE,加载你写的ActiveX,再进行如下操作:
    delphi中,Run|Attach to Process...
    打开一个窗口,找到IEXOPLORER.exe程序,如果没有,选择下面的"Show System Processes"
    然后再Attach,这个时候会跳出一个错误窗口,不用管它,关闭,继续运行。
    在IE里面执行到你设置断点的地方,就可以进行调试了。
    注意文件的输出路径要和注册的地方是一个地方。有不明白的地方可以给我发消息,祝你好运了。