2012-08-03 40 views
1

我已经能够创建出象这样SharePoint.OpenDocuments.1 ActiveX控件的一个实例:普通C++代码来调用COM方法与参数

CLSID clsid; 
HRESULT hResult; 
IDispatch *pWApp; 
LPCOLESTR strPid = L"SharePoint.OpenDocuments.1"; 

CoInitialize(NULL); 
hResult = CLSIDFromProgID(strPid, &clsid); 
if(SUCCEEDED(hResult)) 
    hResult = CoCreateInstance(clsid, NULL, CLSCTX_ALL , IID_IDispatch, (void **)&pWApp); 

我有一些麻烦调用“EditDocument”的方法有文件名称。我无法弄清楚如何调用或使用变体。

任何代码提示?

+1

使用#import指令可避免必须编写晚期代码。这在脚本语言中很容易,绝对不在C++中。 – 2012-08-04 17:43:58

回答

2

至少如果我正确阅读文档,您需要一个BSTR,您可以使用SysAllocString创建。

+0

这很可能是问题所在。不同的是,SysAllocString会为字符串添加前缀长度,而手动方式不会(更确切地说,前两个字节将被视为长度)。更好的是,使用'_bstr_t'类来管理字符串,并在需要时调用SysFreeString。 – 2012-08-03 19:19:22

0

如果你在你的C++项目中使用ATL,你可以很容易地使用类CComBSTR创建BSTR字符串,如果你不使用ATL把它作为参数来OpenDocuments.EditDocuments

CComBSTR tempBstr = _T("c:\\myfolder\\myfile.txt"); 
someObj->SomeMethodThatUsesBSTR(tempBstr); 

,你然后可以使用类bstr_tcomutil.h以同样的方式:

bstr_t tempBstr = _T("c:\\myfolder\\myfile.txt"); 
someObj->SomeMethodThatUsesBSTR(tempBstr.GetBSTR()); 

两个类(的CComBSTR和bstr_t)只是包装,将调用SysAllocStringSysFreeString INTERNA LLY。