C# 在.NET中导入IWinInetHttpInfo(COM)的正确方法是什么?

C# 在.NET中导入IWinInetHttpInfo(COM)的正确方法是什么?,c#,com,com-interop,C#,Com,Com Interop,我很难导入和使用.NET中的COM接口IWinInetHttpInfo() 我正在编写IDownloadManager的实现,这最终导致我实现了这个接口以获得一些原始的头文件 这个接口只有一个方法QueryInfo(参见上面的链接)。在.NET中编写签名似乎是错误的,因为我调用它时总是得到HRESULT 0x80070057(参数不正确) 以下是我目前掌握的情况: [ComImport, ComVisible(true)] [Guid("79eac9d8-bafa-11ce-8c82-00aa0

我很难导入和使用.NET中的COM接口
IWinInetHttpInfo
()

我正在编写
IDownloadManager
的实现,这最终导致我实现了这个接口以获得一些原始的头文件

这个接口只有一个方法QueryInfo(参见上面的链接)。在.NET中编写签名似乎是错误的,因为我调用它时总是得到HRESULT 0x80070057(参数不正确)

以下是我目前掌握的情况:

[ComImport, ComVisible(true)]
[Guid("79eac9d8-bafa-11ce-8c82-00aa004ba90b")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[CLSCompliant(false)]
public interface IWinInetHttpInfo
{
    [return: MarshalAs(UnmanagedType.I4)]
    [PreserveSig]
    int QueryInfo(

        [In, MarshalAs(UnmanagedType.U4)] UInt32 dwOption,
        IntPtr pBuffer,
        [In, Out, MarshalAs(UnmanagedType.U4)] ref UInt32 pcbBuf,
        [In, Out, MarshalAs(UnmanagedType.U4)] ref UInt32 pdwFlags,
        [In, Out, MarshalAs(UnmanagedType.U4)] ref UInt32 pdwReserved);
}
我有一种感觉,我上面的签名是错误的,但我不知道如何解决它。任何指导都将不胜感激

编辑:以下是示例用法:

IWinInetHttpInfo spWinInetHttpInfo = (IWinInetHttpInfo)m_pBinding;    //this cast causes queryinterface to be called

if (spWinInetHttpInfo != null)
{
    uint size = 0; //sizeof(DWORD)
    uint flags = 0;

    //Get all headers
    uint ignore = 0;
    int hrTemp = spWinInetHttpInfo.QueryInfo(Constants.HTTP_QUERY_RAW_HEADERS_CRLF, 
         IntPtr.Zero, ref size, ref flags, ref ignore);

    //we get here, but hrTemp == 0x80070057
}
添加信息:

我尝试在C++中移植OnPosivEdgress方法:

提示:在.NET中处理COM互操作时,您不需要在
pBinding
上调用
QueryInterface
,您只需将其转换到
iwininettpInfo
,而.NET将为您执行查询。所以你可以做
iwininetttpinfo=(iwininetttpinfo)pBinding。这里的文档中有更多内容:我不相信你的
pBuffer
应该通过ref传递。IntPtr已经是一个指针,所以你的interop签名看起来像是一个
LPVOID*
,当你真的想让它看起来像
LPVOID
,所以不要再通过ref传递
pBuffer
,看看能不能修复它。谢谢你的提示!这似乎在获得界面方面起了作用,但我仍然得到了如上所述的失败。我将更新这个问题,使其包含更简洁的版本。@vcsjones,恐怕它仍然不起作用。不过,我认为这是朝着正确方向迈出的一步,所以我更新了这个问题。查看文档,我没有看到任何地方说可以将NULL传递到pBuffer。这是有意义的,因此您可以首先获得尺寸,但通常会在文档中的某个地方进行注释。