PInvoke на платформе Windows Mobile - PullRequest
       21

PInvoke на платформе Windows Mobile

1 голос
/ 02 ноября 2009

Итак, я пытаюсь вызвать функцию, которая есть в моей неуправляемой DLL C ++.

void foo(char* in_file, char * out_file)

В моем приложении на C # я объявляю ту же функцию, что и

[DllImport("dll.dll")]
public static extern void foo(byte[] in_file, byte[] out_file);

Фактические параметры, которые я передаю через ASCII-кодировщик, вот так

byte[] param1 = Encoding.ASCII.GetBytes(filename1);
byte[] param2 = Encoding.ASCII.GetBytes(filename2);
foo(param1, param2);

Все работает, кроме случаев, когда длина param1 равна 0, или 36, или 72 символам (в байтах). Затем по какой-то причине DLL сообщает о полученной длине 1, 38, 73 с символом 0x16, добавленным в самом конце.

Я потратил полдня на попытки отладить и понять, почему это происходит. Есть идеи? Какое значение кратно 36?

Редактировать / решение

После того, как я опубликовал это, меня поразил возможный ответ. Добавив нулевой символ 0x0 в конец моих строк перед преобразованием их в байтовые массивы, я устранил проблему. Хотя я не уверен, что так задумано.

1 Ответ

2 голосов
/ 02 ноября 2009

Вы сами наткнулись на ответ - нигде не указана длина, переданная функции.

Вам необходимо тщательно продумать, над какими функциями вы выполняете, и действительно ли ASCII - это то, что вам нужно.

Возможно, вы действительно этого хотите, без необходимости кодировки ASCII и нулевого завершения, явно указанного в маршалированном типе:

[DllImport("dll.dll")]
public static extern void foo(
    [MarshalAs(LPStr)] string in_file,
    [MarshalAs(LPStr)] string out_file);

Но проверьте вашу реализацию foo () и убедитесь, что вы понимаете, что в действительности вы ожидаете передать.

...