gpt4 book ai didi

c# - 将 NULL 传递给 COM 接口(interface)方法的 ref/out 参数

转载 作者:太空狗 更新时间:2023-10-30 00:41:43 24 4
gpt4 key购买 nike

如果定义为 [In, Out] ref int pchEaten,如何将 NULL 传递给 COM 接口(interface)方法的参数?

例如,考虑以下接口(interface):

[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 参数,一个带有适当的签名,并根据我是否需要传递和接收来选择重载值(value)。但是,如果我尝试在 COM 中多次导入相同的方法,它将无法正常工作,因为方法的顺序很重要并且函数指针会移动。

问题:如何使用输入/输出参数的值和 NULL 调用 COM 方法?

注意:这只是一个例子。我知道我可以创建一个虚拟变量,将其传递给 ref 参数并忽略返回值。但是,方法的行为可能取决于值是否为 NULL,非空值可能会产生性能成本等,所以我想避免它。

最佳答案

您可以像这样重新定义接口(interface),例如:

internal interface IShellFolder
{
void ParseDisplayName (
[In] IntPtr hwnd,
[In] IBindCtx pbc,
[In, MarshalAs (UnmanagedType.LPWStr)] string pszDisplayName,
IntPtr pchEaten,
[Out] out PIDLIST ppidl,
[In, Out] ref SFGAO pdwAttributes);
// ...
}

如果你想传递空值,可以这样调用:

ParseDisplayName(...., IntPtr.Zero, ...);

或者如果你想传递一个 uint 值,像这样:

IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));
uint i = 1234;
Marshal.StructureToPtr(i, p, false);
ParseDisplayName(...., p, ...);
i = (uint)Marshal.PtrToStructure(p, typeof(uint)); // read the value back
Marshal.FreeHGlobal(p);

关于c# - 将 NULL 传递给 COM 接口(interface)方法的 ref/out 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18975177/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com