Я хочу использовать функцию в C ++ DLL в моем приложении C #, используя DLLImport:
BOOL IsEmpty (DWORD KeyID, BOOL * pFlag)
Я перепробовал много комбинаций, но тщетно .. вроде:
public extern static bool IsEmpty (int KeyID, ref bool pFlag);
Метод возвращает false (это означает ошибку)
У кого-нибудь есть идеи о том, как это сделать?
Спасибо!
к цитата «Вилли» (с изменениями):
Остерегайтесь логических значений!
Win32 определяет разные версии логических значений.
1) BOOL, используемый большинством Win32 API,
неподписанный intподписанный int (4 байта)2) BOOLEAN — это один байт, используемый только несколькими win32 API !!
3) и C / C ++ имеет встроенный «bool», который представляет собой один байт
…и добавить то, на что указал @tenfour:
4) еще более странный VARIANT_BOOL
typedef short VARIANT_BOOL;
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
#define VARIANT_FALSE ((VARIANT_BOOL)0)
Характер со знаком или без знака не должен иметь значения для BOOL, поскольку единственный «ложный» шаблон равен 0. Поэтому попробуйте трактовать его как 4-байтовое количество … однако вы взаимодействуете с DWORD может быть удовлетворительным, (Я не имел дело с 64-битными соглашениями Windows.)
BOOL
в Win32 это typedef из int, так что вы должны просто изменить bool
в Int32
так что определение int IsEmpty(uint KeyID, ref int pFlag)
потому что в c ++ BOOL определяется как int. Вы должны использовать
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool IsEmpty(uint KeyID, ref int pFlag) ;
Спасибо за помощь!
наконец-то это работает для меня
public extern static int IsEmpty (
int KeyID,
int [] pFlag)