[英]How to use a .Net Assembly in Delphi without registering it in the GAC or COM?
[英]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.