DLLImport с аргументами char *. Передается только один символ - PullRequest
2 голосов
/ 02 сентября 2011

Я написал C ++ DLL со следующей экспортированной функцией

extern "C" BOOL WINAPI SetUserPassword(const char* u, const char* p)

При вызове этого из C # я использую следующий код

[DllImport("mydll.dll")]
private static extern int SetUserPassword(String user, String password);

Теперь, когда вызывается SetUserPasswordЯ получаю только первую букву каждого параметра.Я немного погуглил и обнаружил, что String, возможно, не самый лучший в использовании, поэтому попробовал использовать IntPtr и Marshal.StringToBSTR(), но это тоже не сработало.

Как это правильно структурировать?Я могу изменить C ++ DLL, если требуется.

1 Ответ

9 голосов
/ 02 сентября 2011

Единственное, что имеет смысл, это то, что ваш код C # на самом деле:

[DllImport("mydll.dll", CharSet = Unicode)]
private static extern int SetUserPassword(String user, String password);

Когда вы делаете это, вы передаете в код C ++ строку на основе широких символов и, поскольку она ожидает однобайтовые символы, она интерпретирует 0 байт во второй половине первых двухбайтовых символов как терминатор строки.

Вы должны написать:

[DllImport("mydll.dll", CharSet = Ansi)]
private static extern int SetUserPassword(String user, String password);

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


И на самом деле оказывается, что вы используете CE, который не поддерживает набор символов Ansi, и поэтому единственное разумное решение - заставить ваш код C ++ принимать строки широких символов.

...