将 ByRef 可变长度数组从 COM 编组到 C#

发布于 2024-11-19 11:27:32 字数 435 浏览 2 评论 0原文

我无法正确获取此 COM 接口的托管签名,有什么建议吗?

MIDL_INTERFACE("6788FAF9-214E-4b85-BA59-266953616E09")
IVdsVolumeMF3 : public IUnknown
{
public:
    virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryVolumeGuidPathnames( 
        /* [size_is][size_is][string][out] */ __RPC__deref_out_ecount_full_opt_string(*pulNumberOfPaths) LPWSTR **pwszPathArray,
        /* [out] */ __RPC__out ULONG *pulNumberOfPaths) = 0;
};

I am having trouble getting the managed sig correct for this COM interface any suggestions?

MIDL_INTERFACE("6788FAF9-214E-4b85-BA59-266953616E09")
IVdsVolumeMF3 : public IUnknown
{
public:
    virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryVolumeGuidPathnames( 
        /* [size_is][size_is][string][out] */ __RPC__deref_out_ecount_full_opt_string(*pulNumberOfPaths) LPWSTR **pwszPathArray,
        /* [out] */ __RPC__out ULONG *pulNumberOfPaths) = 0;
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

说不完的你爱 2024-11-26 11:27:32

您需要自己封送字符串数组。声明应如下所示:

[PreserveSig]
int QueryVolumeGuidPathNames(out IntPtr pathArray, out uint numberOfPaths);

代码应如下所示:

IntPtr pathPtr;
int count;
var result = new List<string>();
int hr = obj.QueryVolumeGuidPathNames(out pathPtr, out count);
if (hr < 0) throw new COMException("Oops", hr);
for (int ix = 0; ix < count; ++ix) {
    IntPtr strPtr = Marshal.ReadIntPtr(pathPtr, ix * IntPtr.Size);
    result.Add(Marshal.PtrToStringUni(strPtr));
    Marshal.FreeCoTaskMem(strPtr);
}
Marshal.FreeCoTaskMem(pathPtr);

当然未经测试。

You need to marshal the string array yourself. The declaration should look like this:

[PreserveSig]
int QueryVolumeGuidPathNames(out IntPtr pathArray, out uint numberOfPaths);

And the code ought to resemble this:

IntPtr pathPtr;
int count;
var result = new List<string>();
int hr = obj.QueryVolumeGuidPathNames(out pathPtr, out count);
if (hr < 0) throw new COMException("Oops", hr);
for (int ix = 0; ix < count; ++ix) {
    IntPtr strPtr = Marshal.ReadIntPtr(pathPtr, ix * IntPtr.Size);
    result.Add(Marshal.PtrToStringUni(strPtr));
    Marshal.FreeCoTaskMem(strPtr);
}
Marshal.FreeCoTaskMem(pathPtr);

Untested of course.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文