我试图将LabView程序移植到C ++,而它包含的OLE调用给我带来了一些麻烦。
LabView程序首先进行"自动化打开"即获得对界面的引用" XLib.XInterface" (LabView将此表达式称为" ActiveX类"),然后调用接口中找到的方法QA,最后再次关闭引用。我认为LabView从类型库获取其界面信息,但我并不确定。
我尝试为Word自动化调整一些代码:http://www.codeproject.com/KB/office/MSOfficeAuto.aspx
CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"XConfig.XInterface", &clsid);
IDispatch *pWApp;
if(SUCCEEDED(hr))
{
hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
IID_IDispatch, (void **)&pWApp);
}
// etc.
该程序成功查找了CLSID,但CoCreateInstance失败,声称该类未注册。我还尝试直接从类型库输入CLSID,绕过CLSIDFromProgID,但产生相同的结果。毋庸置疑,LabView程序运行正常,而且我使用的C ++代码在使用progID" Word.Application"时完全没有麻烦创建Word实例。有问题的界面如下所示:
[
odl,
uuid(33AAA2DA-70EB-48EE-ACA7-DD0D1F5CAF2D),
helpstring("XInterface Interface"),
dual,
oleautomation
]
interface XInterface : IDispatch {
[id(0x00000001), helpstring("method QA")]
HRESULT QA();
[id(0x00000002), helpstring("method LoadFromDisk")]
HRESULT LoadFromDisk();
...
正如您可能已经注意到的,OLE对我来说是一种新的东西(很可能,这是问题的一部分)。任何提示将不胜感激。感谢。
答案 0 :(得分:0)
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void **)&pWApp);
它似乎有效;至少我不再得到“类未注册”的错误。不同之处在于将参数CLSCTX_LOCAL_SERVER替换为CLSCTX_ALL。我认为这与我正在使用dll这一事实有关。有没有人有更深刻的解释?