Маршалинг параметров в вызов функции API C ++ из приложения C #

Я вызываю вызов функции C / C ++ из библиотеки DLL в моем приложении C #. Я не могу на всю жизнь понять, как правильно Маршалл данные.

Вот информация о функции API, которую я пытаюсь вызвать:

LONG LoginDialog (HWND hWndParent, LPCWSTR lpctstrTitle, ULONG
ulFlags, LPWSTR lptstrDataSource, LONG lDSLength, LPCWSTR
lpctstrUsername, LPCWSTR lpctstrPassword, LPCWSTR lpctstrSchema);

Параметры:
[in] hWndParent Определяет дескриптор родительского окна для отображения диалогового окна входа в систему.
[in] lpctstrTitle Указатель на завершающуюся нулем строку, указывающую заголовок для отображаемого диалогового окна входа в систему. Укажите нулевой указатель, чтобы использовать заголовок диалога по умолчанию.
[in] ulFlags Определяет операцию входа и маску стиля диалога. Это может быть 0 или побитовая ИЛИ комбинация флагов, перечисленных в Флажках стиля диалога входа.
[in, out] lptstrDataSource Указатель на строковый буфер с нулевым символом в конце, указывающий имя источника данных для входа в систему. На выходе этот буфер получает имя источника данных, в который вошел пользователь (в случае, если имя источника данных было изменено в диалоге входа в систему).
[in] lDSLength Определяет длину строкового буфера, указанного lptstrDataSource.
[in] lpctstrUsername Указатель на завершающуюся нулем строку, определяющую имя пользователя.
[in] lpctstrPassword Указатель на завершающуюся нулем строку, указывающую пароль.
[in] lpctstrSchema Указатель на завершающуюся нулем строку, указывающую полный путь к файлу схемы. Укажите нулевой указатель, если схема не нужна.

Вот мой код:

[DllImport("dmawin.dll", CharSet = CharSet.Unicode)]
private static extern int LoginDialog(IntPtr pWndParent, string pStrTitle,
uint pFlags, [MarshalAs(UnmanagedType.LPWStr)] ref StringBuilder pStrDataSource,
int pDSLength, string pStrUsername, string pStrPassword, string pStrSchema);private bool Login(string pDataSource, string pLoginName,
string pPassword, string pScheme)
{
private const int MAX_DB_NAME = 256;
IntPtr handle = ParentForm.Handle;
var sb = new StringBuilder(pDataSource, MAX_DB_NAME);

//function call
LoginDialog(handle, null, flags, ref sb, MAX_DB_NAME, pLoginName,
pPassword, pScheme);
}

Я почти уверен, что неправильно маршалинг 4-го параметра (LPWSTR lptstrDataSource). Я пробовал разные ответы, которые нашел в Интернете, но ни один из них не помог мне.

Я также получаю это предупреждение первым. Извините, что не уточнил:

Помощник по управляемой отладке ‘LoadFromContext’ обнаружил проблему
..

Дополнительная информация: сборка была загружена из ‘dll
location ‘используя контекст LoadFrom. Использование этого контекста может
привести к неожиданному поведению для сериализации, приведения и
разрешение зависимостей. Почти во всех случаях рекомендуется
LoadFrom контекст следует избегать. Это можно сделать, установив сборки
в глобальном кэше сборок или в каталоге ApplicationBase и
использование Assembly.Load при явной загрузке сборок.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]