【发布时间】:2013-09-24 07:11:54
【问题描述】:
如果COM接口方法的参数定义为[In, Out] ref int pchEaten,如何将NULL传递给?
例如,考虑以下接口:
[ComImport, Guid ("000214E6-0000-0000-C000-000000000046")]
[InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
internal interface IShellFolder
{
void ParseDisplayName (
[In] IntPtr hwnd,
[In] IBindCtx pbc,
[In, MarshalAs (UnmanagedType.LPWStr)] string pszDisplayName,
[In, Out] ref uint pchEaten,
[Out] out PIDLIST ppidl,
[In, Out] ref SFGAO pdwAttributes);
// ...
}
MSDN 对pchEaten 参数进行了如下说明:一个指向 ULONG 值的指针,该值接收已解析的显示名称的字符数。如果您的应用程序不需要此信息,请将 pchEaten 设置为 NULL,并且不会返回任何值。 pdwAttributes 参数也可以设置为 NULL。
但是,当我从 C# 调用 ParseDisplayName 方法时,我看不到将 null 传递给 ref 参数的方法。
如果我从 DLL 调用函数,我可以多次导入一个函数:一个带有 IntPtr 参数,一个带有适当的签名,然后根据我是否需要传递和接收值来选择重载。但是,如果我尝试在 COM 中多次导入相同的方法,它不会起作用,因为方法的顺序很重要,而且函数指针会发生变化。
问题:如何使用 in/out 参数的值和 NULL 来调用 COM 方法?
注意:这只是一个例子。我知道我可以创建一个虚拟变量,将其传递给ref 参数并忽略返回值。但是,方法的行为可能取决于值是否为 NULL,非 null 值可能会产生性能成本等,所以我想避免它。
【问题讨论】:
-
@FlorianGl 这个问题和答案不包括我的情况,一个COM接口。正如我已经提到的,我知道 DLL 案例的解决方案。
-
这并不能解决你的问题,但是这个参数必须是
out,而不是ref。 -
@sharptooth 在 IDL 中是
[in, out, unique, annotation("__reserved")] ULONG *pchEaten,但在文档中是[out] ULONG *pchEaten。奇怪的。逻辑上应该是out,没错。 -
哎哟。 IDL 与文档不匹配有点令人担忧。
标签: c# com null interop com-interop