Тип данных между различными процессами и архитектурами - написание правильного DllImport - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть основное приложение, написанное на C #, которое работает как x64-битное приложение, оно связывается через импорт dll со стандартным собственным неуправляемым dll C / C ++, заголовок которого у меня есть.

Мне нужна помощь для установки правильных типов данных.

Итак, я раскрываю один из методов, которые мне нужно вызвать, и типы данных, определенные в заголовке dll.

typedef int DLL_IMP_EXP (* INJECTDLL)(HANDLE, DWORD, LPCTSTR, DWORD, HINSTANCE *);

РУЧКА определяется как void *

DWORD определяется как unsigned long

LPCTSTR определяется как __ ноль определено CONST CHAR *

HINSTANCE дает мне эту строку для определения: DECLARE_HANDLE (HINSTANCE); ?!?

Использование объявления функции в Юникоде: LPCWSTR определяется как __ ноль определенное значение CONST WCHAR *

Пожалуйста, помогите мне написать правильную декларацию:

[DllImport ("Inject.dll", VariousParameters)]
public static extern int InjectDll(CorrectDataTypes);

Компиляция Различные параметры при необходимости и, очевидно, CorrectDataTypes .

1 Ответ

1 голос
/ 10 сентября 2011

И IntPtr используется для указателя или дескриптора - это будет 32 бита в 32-битной системе и 64 в 64-битной системе. Поэтому, если у вас есть что-то, что является необработанным указателем или дескриптором, используйте IntPtr, и он будет работать правильно в обеих системах. Однако ваш последний параметр - указатель на дескриптор - используйте ref для обработки указателя. Так что в этом случае, так как это указатель на дескриптор, параметр будет ссылкой на IntPtr.

Для стандартных числовых типов они сопоставляются непосредственно с типами данных .NET - более подробную информацию можно получить по адресу MSDN .

Строки с нулевым символом в конце обрабатываются правильно, хотя вам необходимо указать, использует ли он строки ANSI или Unicode.

Наконец, P / Invoke предполагает соглашение о вызовах StdCall (это то, что использует Windows API). Если вы не используете его, который в прототип функции будет включать STDCALL или __stdcall, стандартное соглашение о вызовах C - Cdecl. Хотя вам придется выяснить, к чему расширяется DLL_IMP_EXP.

Итак, ваша декларация P / Invoke должна быть:

[DllImport ("Inject.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern int InjectDll(IntPtr handle, uint dword, string str, uint dword2, ref IntPtr hInstance);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...