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

Is it possible to wrap the COM DLL in application without registering it?

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

有没有办法在部署时以某种方式将 COM.dll 包装在 EXE 中,以便用户不必手动注册 COM.dll?

我正在使用 Delphi XE8

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;

我最近在研究类似的东西,事实证明这很简单。 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;