已经生成了OCX,但是页面里面调用,提示对象不支持。。
CLSID什么的都是对的,界面上能显示一个黑色表格。。但就是没法调用其中的方法wmcardPro.dpr:
主要是最后那三个方法
library wmcardPro;uses
  ComServ,
  wmcardPro_TLB in 'wmcardPro_TLB.pas',
  wmcardImp in 'wmcardImp.pas' {ActiveFormX: TActiveForm} {ActiveFormX: CoClass};{$E ocx}exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer,
  ReadUserCard,
  WriteManageCard,
  CheckCard;{$R *.TLB}{$R *.RES}begin
end.
wmcardImp.pas中的一段
function ReadUserCard: string;
var
  dest: PChar;
  n1:Integer;
  begin
     n1:=LoadLibrary('WHMQ.DLL');
     fnReadUserCard:=getprocaddress(n1,'ReadUserCard');
     dest:=fnReadUserCard();
     Result :=IntToStr(BinToInt(Copy(dest,1,3)))+'|'+IntToStr(BinToInt(Copy(dest,4,1)))+'|'+
     IntToStr(BinToInt(Copy(dest,5,4)))+'|'+IntToStr(BinToInt(Copy(dest,9,3)))+'|'+
     IntToStr(BinToInt(Copy(dest,12,3)))+'|'+IntToStr(BinToInt(Copy(dest,15,3)));
     FreeLibrary(n1);
  end;function CheckCard :Integer;
var
  n1:Integer;
begin
  n1:=LoadLibrary('WHMQ.DLL');
  fnCheckCard:=getprocaddress(n1,'CheckCard');
  Result :=fnCheckCard;
  FreeLibrary(n1);
end;function WriteManageCard(s:string):char;
var
  n1,t:Integer;
  s1,s2:string;
begin
  n1:=LoadLibrary('WHMQ.DLL');
  fnWriteManageCard:=getprocaddress(n1,'WriteManageCard');
  s1:='';
  s2:=s;
  t:=0;
  while(Pos('|',s2)<>0) do
  begin
  if t=2 then
  s1:=s1+IntToBin(StrToInt(LeftStr(s2,Pos('|',s2))),1)
  else if t=3 then
  s1:=s1+IntToBin(StrToInt(LeftStr(s2,Pos('|',s2))),5)
  else
  s1:=s1+IntToBin(StrToInt(LeftStr(s2,Pos('|',s2))),3);
  s2:=RightStr(s2,Pos('|',s2));
  t:=t+1;
  end;
  Result :=fnWriteManageCard(s1);
  FreeLibrary(n1);
end;程序是调用其他的DLL的,DLL是正常,我VB能够调用到。
大家帮忙看下是不是隐私级别哪里有问题。谢谢了!

解决方案 »

  1.   

    你是没有定义出接口的方法吧?不是通过exports导出,对TLB文件View之后选Type Library, 然后在Ixxxx接口下面New一个Method,填入输入输出参数,就会生成
    protected
      function WriteManageCard(s:PChar):char; stdcall;类似的代码
      

  2.   

    我觉得你同事将DLL和COM搞混了,不是动态和静态调用的问题。DLL只要exports 函数,其他程序就可以使用, COM必须提供个接口,再实现接口,那么这个接口就的方法才能让其他程序、或者Web使用。如果不理解,找本COM的书来看看