Как определить структуру TBBUTTON в C #? - PullRequest
0 голосов
/ 31 марта 2011

Приветствую всех,

Структура TBBUTTON определяется в MSDN следующим образом:

typedef struct {
  int       iBitmap;
  int       idCommand;
  BYTE      fsState;
  BYTE      fsStyle;
#ifdef _WIN64
  BYTE      bReserved[6];
#else 
#if defined(_WIN32)
  BYTE      bReserved[2];
#endif 
#endif 
  DWORD_PTR dwData;
  INT_PTR   iString;
} TBBUTTON, *PTBBUTTON, *LPTBBUTTON;

Мне нужно сделать некоторое взаимодействие в C # с использованием этой структуры.Как мне воспроизвести этого монстра, чтобы он был правильно определен при компиляции для AnyCPU?Google явно полон опасной дезинформации!

Ответы [ 2 ]

3 голосов
/ 02 апреля 2011

Ахах, я знал, что должен быть способ.И вот оно:

[StructLayout(LayoutKind.Sequential)]
public struct TBBUTTON {
    public int iBitmap;
    public int idCommand;
    [StructLayout(LayoutKind.Explicit)]
    private struct TBBUTTON_U {
        [FieldOffset(0)] public byte fsState;
        [FieldOffset(1)] public byte fsStyle;
        [FieldOffset(0)] private IntPtr bReserved;
    }
    private TBBUTTON_U union;
    public byte fsState { get { return union.fsState; } set { union.fsState = value; } }
    public byte fsStyle { get { return union.fsStyle; } set { union.fsStyle = value; } }
    public UIntPtr dwData;
    public IntPtr iString;
}

Marshal.SizeOf возвращает 32 в процессах x64 и 20 в процессах x86, и все заканчивается так, как должно, когда я передаю это SendMessage.Я знал, что ты мог сделать это, C #!

2 голосов
/ 31 марта 2011

Лучше всего определить две версии: одну для 32-битной и одну для 64-битной.

public struct TBBUTTON32
{
    int       iBitmap;
    int       idCommand;
    byte      fsState;
    byte      fsStyle;
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 2)]
    byte[]    bReserved;
    UIntPtr   dwData;
    IntPtr    iString;
}

64-битная версия такая же, но с SizeConst = 6 в зарезервированном массиве байтов.

Тогда вам нужно переключаться между ними во время выполнения.Ваш код C # должен определить, работает ли он как 32- или 64-битный процесс.

...