簡體   English   中英

是否可以在不注冊的情況下將 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

我最近正在研究類似的東西,結果證明它很簡單。 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM