我在控制台用如下命令可以注册com服务:
regsvr32 mydll.dll
这其实是调用了mydll.dll导出的DllRegisterServer函数
可是borland建议程序员不要在程序中直接调用这个函数 当我发布一个软件时不见得让用户自己打控制台命令来注册吧
我想知道自己写程序的实现的方法
谢谢各位

解决方案 »

  1.   

    你可以在制作安装程序时来注册这个dll呀。installshield不是有注册dll文件的功能吗?
      

  2.   

    有道理
    不过我用inno setup(is的做出的文件大了点),不知道这个东东有没这个功能
      

  3.   

    unit RegSvr;interfaceuses Classes, SysUtils, Windows;type
      TRegAction = (raRegister, raUnregister);
    procedure TRegSvr(FileName :String; RegAction :TRegAction = raRegister);
    procedure DLLRegisterServer(FileName :String);
    procedure DllUnregisterServer(FileName :String);resourcestring
      SELoadFile = 'error in open DLL file';
      SEFindProc = 'can''''t find register procedure.'; 
      SERegisterFail = 'not found type library in specific file';
    implementationprocedure TRegSvr(FileName :String; RegAction :TRegAction = raRegister);
    var
      LibHandle :Integer;
      Proc :function : HResult; stdcall;
    const
      SProcName: array[TRegAction] of PChar =
        ('DllRegisterServer', 'DllUnregisterServer');
    begin
      LibHandle := LoadLibrary(PChar(FileName));
      if LibHandle = 0 then raise Exception.Create(SELoadFile);
      try
        @Proc := GetProcAddress(LibHandle, SProcName[RegAction]);
        if @Proc = nil then raise Exception.Create(SEFindProc);
        if Proc <> 0 then raise Exception.Create(SERegisterFail);
      finally
        FreeLibrary(LibHandle);
      end;
    end;procedure DLLRegisterServer(FileName :String);
    begin
      TRegSvr(FileName, raRegister);
    end;procedure DllUnregisterServer(FileName :String);
    begin
      TRegSvr(FileName, raUnregister);
    end;end.
      

  4.   

    uses OleCtl; //..Program Files\Borland\Delphi6\Source\Rtl\Win\OleCtl.pas
    var
        OCXHand: THandle;
        RegFunc: TDllRegisterServer;
    begin
    Try
       OCXHand:= LoadLibrary(PChar('c:\test.Dll'));
       RegFunc:= GetProcAddress(OCXHand, 'DllRegisterServer');
       if RegFunc <> 0 then
          MessageBox(Application.Handle,'不能注册!','提示',MB_ICONINFORMATION+MB_OK);
       FreeLibrary(OCXHand);
    except
       MessageBox(Application.Handle,'注册失败!','提示',MB_ICONINFORMATION+MB_OK);
    end;
    end;