【问题标题】:error C2440: 'function' : cannot convert from 'const IID' to 'DWORD'错误 C2440:“函数”:无法从“const IID”转换为“DWORD”
【发布时间】:2010-11-24 00:11:52
【问题描述】:

在尝试托管 CLR 时,我不断收到以下信息:

错误 C2440:“函数”:无法从“const IID”转换为“DWORD”

我的代码:

ICLRRuntimeHost *host = NULL;
HRESULT result = CorBindToRuntime(NULL, L"wks", CLSID_CLRRuntimeHost, 
    IID_ICLRRuntimeHost, (PVOID*)&host);

顺便说一句,这是用 C 语言编写的。不是 C++。

编辑:当我用 C++ 编译它时,它工作得很好。它在两种语言中的行为不应该相同吗?

【问题讨论】:

    标签: c clr-hosting


    【解决方案1】:

    CorBindToRuntime 的最后一个参数定义为 LPVOID*,而不是 PVOID*。也许这就是问题所在?

    HRESULT CorBindToRuntime (
            [in]  LPCWSTR     pwszVersion, 
            [in]  LPCWSTR     pwszBuildFlavor, 
            [in]  REFCLSID    rclsid, 
            [in]  REFIID      riid, 
            [out] LPVOID FAR  *ppv
    );
    

    【讨论】:

    • 现在的错误是:“error C2440: 'function' : cannot convert from 'const IID' to 'const IID *const '”
    • 奇怪的是,当我用 C++ 编译上面的代码时,一切正常。这怎么可能?
    【解决方案2】:

    来自 guiddef.h:

    #ifndef _REFIID_DEFINED
    #define _REFIID_DEFINED
    #ifdef __cplusplus
    #define REFIID const IID &
    #else
    #define REFIID const IID * __MIDL_CONST
    #endif
    #endif
    
    #ifndef _REFCLSID_DEFINED
    #define _REFCLSID_DEFINED
    #ifdef __cplusplus
    #define REFCLSID const IID &
    #else
    #define REFCLSID const IID * __MIDL_CONST
    #endif
    #endif
    

    换句话说,在 C++ 中,这两个是引用,而在 C 中,它们是指针。你需要使用:

    ICLRRuntimeHost *host = NULL;
    HRESULT result = CorBindToRuntime(NULL, L"wks", &CLSID_CLRRuntimeHost,
        &IID_ICLRRuntimeHost, (PVOID*)&host);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多