完全可以按照 dll 的方式和 com 组件进行通信的。
这是我以前写的一段“不注册 com 直接加载 com 对象”的代码(主要就是获得 IClassFactory 然后通过它去创建 com 对象,避免了需要目标系统中“注册”使用):
procedure TJetCarNetscape.InitFlashGetLib;
const
defJetCarNetscapeDisp: TGUID = '{FB5DA723-162B-11D3-8B9B-AA70B4B0B524}';
var
DllGetClassObject: function (const CLSID, IID: TGUID;
var Obj): HResult;
stdcall;
cFactory: IClassFactory;
strFile: string;
cIntf: IDispatch;
begin
strFile := ExtractFilePath(GetModuleName(HInstance)) + 'jccatch.dll';
FHandle := LoadLibrary(PChar(strFile));
@DllGetClassObject := GetProcAddress(FHandle, 'DllGetClassObject');
DllGetClassObject(CLASS_JetCarNetscape, IClassFactory, cFactory);
{
if cFactory <> nil then
cFactory.CreateInstance(nil, fglib.IJetCarNetscape, FJetCar);
}
if cFactory <> nil then
cFactory.CreateInstance(nil, defJetCarNetscapeDisp, cIntf)
else
cIntf := nil;
FJetCar := cIntf;
end;
至于接口的使用方法,只要 import typelib 产生一个 _tlb.pas 按照里面的 interface 使用即可。