用INTPTR实现IDP声明的C#

时间:2011-04-26 12:49:02

标签: c# 64-bit idl

我们在idl文件中声明了一个方法,如下所示:

[id(7), helpstring("method SomeFunction")] HRESULT SomeFunction([in] INT_PTR windowHandle, [out, retval] VARIANT_BOOL* dlgResult);

我们使用这种方法在C#中实现它:

public bool SomeFunction(int windowHandle)

在构建32位时工作正常,但是当我们构建x64时,类型不匹配,因为idl正在寻找64位值,而c#需要32位值。

在C#中使用IntPtr不起作用,因为代码在c#中需要long或int。

我可以在c#方法中使用哪种类型,根据平台编译为long或int?

我宁愿不必通过两次使用该函数来复制代码,并且由于向后兼容性,我不确定我们是否可以将IDL更改为仅使用Int64。

任何帮助将不胜感激。 感谢

2 个答案:

答案 0 :(得分:0)

进入Project Properties ...并进入Build选项卡。

在那里,您可以找到“条件编译符号”,为您的x64平台添加WIN64。保存。

对于“AnyCPU”,您可能想删除该平台......

然后在代码中使用:

#if WIN64
     long handle;
     public bool SomeFunction(long windowHandle)
#else
     int handle;
     public bool SomeFunction(int windowHandle)
#endif

但是我认为你可以使用IntPtr并根据其Size属性将其值转换为int / long ...

答案 1 :(得分:0)

您确定IntPtr不适合您吗? IntPtr结构有一个构造函数重载,需要Int32,另一个需要Int64。此外,它还有ToInt32()方法和ToInt64()方法。你的代码可以这样工作:

public bool SomeFunction(IntPtr windowHandle)
{
    // Implementation here.
    // If you need the value of the pointer in the implementation,
    // you can use:
    // long actualValue = windowHandle.ToInt64();
}

long actualHandle = 1234;
IntPtr handlePtr = new IntPtr(actualHandle);
bool returnValue = SomeFunction(windowHandle);