C # реализация декларации IDL с INT_PTR - PullRequest
0 голосов
/ 26 апреля 2011

У нас есть метод, объявленный в файле 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-битное значение.

Использование IntPtr в C # не работает, потому чтоКоду нужен long или int в c #.

Есть ли какой-либо тип, который я могу использовать в методе c #, который будет компилироваться в long или int в зависимости от платформы?

Я бы предпочел неЯ должен дублировать код, имея функцию дважды, и я не уверен, что мы можем изменить IDL для использования только Int64 из-за обратной совместимости.

Любая помощь будет принята с благодарностью.Спасибо

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Вы уверены, что 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);
0 голосов
/ 26 апреля 2011

Перейдите в Свойства проекта ... и на вкладку Построить.

Там вы можете найти «Условные символы компиляции», добавить WIN64 для вашей платформы x64. Сохранить.

Для "AnyCPU" вы, вероятно, хотите удалить эту платформу ...

Тогда в коде используйте:

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

Однако я думаю, что вы можете использовать IntPtr и преобразовать его значение в int / long в зависимости от его свойства Size ...

...