是否可以在不注册的情况下将COM DLL封装在应用程序中



当前,您必须先regsvr32 COM.dll,然后才能在应用程序(EXE)中使用COM对象。

在部署时,有没有任何方法可以将COM.dll以某种方式包装在EXE中,这样用户就不必手动注册COM.dll?

我使用的是Delphi XE8

我最近在研究类似的事情,结果发现这很简单。COM DLL必须导出一个DllGetClassObject条目以及其他一些条目。一般来说,所选的开发平台会为您做这件事,但在最终的DLL中,它就在那里,两者都可以由COM子系统使用,但也可以由您自己使用这样的代码:

type
  T_DGCO=function(const CLSID, IID: TGUID; var Obj): HResult; stdcall;//DllGetClassObject
var
  p:T_DGCO;
  f:IClassFactory;
  x:IMyObject;//replace by an interface of choice
begin
  p:=GetProcAddress(LoadLibrary(FullPathToDLL),'DllGetClassObject');
  if @p=nil then RaiseLastOSError;
  OleCheck(p(CLASS_MyObject,IClassFactory,f));
  OleCheck(f.CreateInstance(nil,IMyObject,x));
  x.Hello('World');//or whatever your object does
end;
function RegisterServer(const aDllFileName: string; aRegister: Boolean): Boolean;
type
  TRegProc = function: HResult;
  stdcall;
const
  cRegFuncNameArr: array [Boolean] of PChar =
    ('DllUnregisterServer', 'DllRegisterServer');
var
  vLibHandle: THandle;
  vRegProc: TRegProc;
begin
  Result := False;
  vLibHandle := LoadLibrary(PChar(aDllFileName));
  if vLibHandle = 0 then Exit;
    @vRegProc := GetProcAddress(vLibHandle, cRegFuncNameArr[aRegister]);
  if @vRegProc <> nil then
    Result := vRegProc = S_OK;
  FreeLibrary(vLibHandle);
end;

最新更新