这是一个非常简单的IDL接口,我们在VS2008下成功使用了(简短的参数列表缩短了):
interface Mailer
{
string findNode( [in] string requestedNode );
unsigned short addMessage( [in] string msg, [in] unsigned short kind );
};
我们正在将解决方案迁移到VS2010 SP1。现在我们有以下构建错误:
M.idl(3): error MIDL2025: syntax error : expecting a type specification near "string"
这总是像使用VS2008 SP1的魅力一样
请注意,我已将in
替换为[in]
。在摸不着头脑的同时,我发现MIDL 2010也不喜欢in
,但对[in]
没有说什么。
请注意,unsigned short
被接受(通过反转界面的2种方法观察到)。
为什么?如何让MIDL再次理解string
?
TIA。
答案 0 :(得分:1)
看起来编译器不知道类型'string',也许你忘了在项目中包含一些引用,或者它在VS2010中的位置发生了变化等。仔细检查包含,引用等。
P.S。 that有意义吗?
答案 1 :(得分:0)
对于从C#公开,这个:
interface Mailer
{
[return, MarshalAs(UnmanagedType.BStr)]
string findNode( [In, MarshalAs(UnmanagedType.BStr)] string requestedNode );
unsigned short addMessage( [In, MarshalAs(UnmanagedType.BStr)] string msg, [in] unsigned short kind );
};
我看到你可能意味着将它从C ++中暴露出来:
interface Mailer
{
HRESULT findNode( [out, retval] BSTR* result, [in] BSTR requestedNode );
HRESULT addMessage( [out, retval] unsigned short* result, [in] BSTR msg, [in] unsigned short kind );
};
答案 2 :(得分:0)
看来IDL文件虽然存在于项目中,但根本没有使用。 VS2008默默地忽略它(就像它对未引用的.h文件一样)。 出于某种原因,VS2010尝试编译它,即使它没有在其他任何地方引用。由于内容完全错误(字符串确实不是本机IDL类型,但属性最好),我现在有错误。
解决方案:从项目中排除文件!