2017-05-30 73 views
-1

我使用的调用与GUID一个CoCreateInstance创建一个对象(编剧) 是否有可能不使用GUID创建相同COM对象的代码,通过手动加载DLL ?如果是的话,如何找到DLL,如何知道创建对象的函数的名字?从DLL创建COM对象手动

+0

是的,如果有一个平坦的原料药出口。你使用什么对象(那个脚本)? – Victoria

+0

jscript.dll,guid:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58} – Arsnow

+0

Aha,[IActiveScript](https://docs.microsoft.com/en-us/scripting/winscript/reference/iactivescript)接口。 – Victoria

回答

0

一个COM服务器,不管是DLL或EXE或什么的,平时举办许多不同的,而相互连接,接口的实现。

所以你会发现你的服务器的DLL,但你仍然必须告诉服务器应该为你实现它的许多GUID中的哪一个。

见的DllGetClassObject切入点http://msdn.microsoft.com/en-us/library/windows/desktop/ms680760.aspx

要找到COM服务器EXE或DLL检查类似HKEY_CLASSES_ROOT\CLSID\{00000108-0000-0010-8000-00AA006D2EA4}\InprocServer32

的注册表项。然后,您的特定库可以复制与额外的非COM API他们的主要COM API。那么这个非COM API就是你可以用你描述的方式使用的那个。如果它提供了额外的手段。

但是,就通用COM标准而言,这是不可能的,COM是围绕GUID建立的。

+0

免费注册COM允许这个 –

+0

....仍然会要求创建类。而类是GUID。示例:Microsoft XMLLite.DLL API –

0

从DLL直接创建一个对象实例,只要你知道它的确切路径,此代码应工作:

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'); 
    Win32Check(p <> nil); 
    OleCheck(p(CLASS_MyObject, IClassFactory, f)); 
    OleCheck(f.CreateInstance(nil, IMyObject, x)); 
    x.Hello('World'); //or whatever your object does 
end; 
+0

如果DllGetClassObject()或CreateInstance()失败,则调用无参数'RaiseLastOSError()'是错误的,因为它们不使用'SetLastError()'报告错误,所以它们返回改为'HRESULT'错误代码。将错误代码保存到一个变量,并将其传递给重载的'RaiseLastOSError()',该错误代码将错误代码作为输入。或者更好的是,使用'OleCheck()'而不是'LoadLibrary()'''GetProcAddress()''使用'Win32Check()'。 –

+0

看到我最近的编辑。 –

+0

这个答案没有解决另一个需求,引用:创建相同的COM对象**而不使用GUID ** - 没有声明“CLASS_MyObject,IClassFactory”? –