C++ IStorage::OpenStorage OLECHAR*pwcsName for MS Project 2010

C++ IStorage::OpenStorage OLECHAR*pwcsName for MS Project 2010,c++,c,winapi,ms-project,C++,C,Winapi,Ms Project,我找不到任何关于如何使用IStorage::OpenStorage打开MS Project 2010文件的文档。我不知道msproject 2010的OLECHAR*pwcsName参数应该传递什么 以下代码打开MS Project 2007文件,但无法打开MS Project 2010文件: hr = pStorage->OpenStorage(L" 212",NULL,STGM_READ | STGM_SHARE_EXCLUSIVE,

我找不到任何关于如何使用IStorage::OpenStorage打开MS Project 2010文件的文档。我不知道msproject 2010的OLECHAR*pwcsName参数应该传递什么

以下代码打开MS Project 2007文件,但无法打开MS Project 2010文件:

hr = pStorage->OpenStorage(L"   212",NULL,STGM_READ | STGM_SHARE_EXCLUSIVE,
                           NULL,0,&pAuxStorage);
打开MS Project 2010文件的第一个参数必须传递什么?

Lfoo不能传递给需要使用OLECHAR的函数

必须传递由函数族分配的字符串

这些字符串具有特殊的内存布局,并使用COM分配器进行分配。尽管在这两种情况下,数据类型都是wchar\t,但使用名称OLECHAR表示所调用的函数需要这些特殊字符串中的一个

在C语言中,您的代码可以是:

BSTR b = SysAllocString(L"   212");
hr = pStorage->OpenStorage(b, NULL, ......);
SysFreeString(b);

<>在C++中,可以使用RAIE包装器分配和释放字符串,尽管这不是编译器之间的标准。或用于讨论。

对于MS Project 2010或更高版本编写的MPP文件,我认为您需要以下内容:

hr = pStorage->OpenStorage(L"   214",NULL,STGM_READ | STGM_SHARE_EXCLUSIVE,
                           NULL,0,&pAuxStorage);

注意212变为214。Project 2007和Project 2010之间的文件格式发生了更改。

您得到了什么错误代码?它可能提供了一个线索。若要将错误代码转换为人类可读的表示形式,请在调试时添加以下手表:hr,hr。这是假设您正在使用Visual Studio调试器。我不反对,但您是说这与所述问题直接相关吗?@JonathanPotter OP不确定第一个参数传递什么,并显示了一个似乎给出意外结果的示例,我已经解释了如何正确地将字符串传递给第一个参数gain我不反对,但是,鉴于OP似乎对MS Project 2007有效,而他的问题是关于Project 2010的,我只是想知道你的答案是否准确地回答了这个问题。@JonathanPotter这可能是巧合UB是UB,或者Project 2007是零终止的wcslen,但Project 2010验证了长只有OP可以揭示这是否回答了这个问题。伙计们,我上传的例子很有效!你可以说,尽管你喜欢这个问题,是否有人对“MS Project 2010”文件进行了反向工程,为我提供了“pwcsName”,这将导致“OpenStorage”函数打开该文件而不会使其失败。