Marshall char **, чтобы зацепить проблему вызова неуправляемого кода из управляемого кода - PullRequest
1 голос
/ 20 мая 2011

У меня есть эта функция C ++,

    bool MyClass::my_function(int num, TCHAR** filepath)

Я выставил функцию как

    extern "C"
    {
      __declspec(dllexport) bool MyFunction(int num, char* filepath[])
      {
          OutputDebugStringA("--MyFunction--");
          TCHAR **w_filepath = (TCHAR **)calloc(num, 2* sizeof(TCHAR **));
          for(int i = 0; i < num; i++) 
          {
            OutputDebugStringA(filepath[i]);
            int len = strlen(filepath[i]) + 1;
            w_filepath[i] = (TCHAR *)calloc (1, len);
            ctow(w_filepath[i], filepath[i]); // converts char to WCHAR
          }

          bool ret = MyClass.my_function(num, w_filepath);
          OutputDebugStringA("End -- MyFunction --");
          free(w_filepath);
          return ret;
      }
    }

У меня есть оболочка C # как

    [DllImport("MyDll.dll")]
    public static extern bool MyFunction(int num, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPTStr)] string[] filepath);

В C # я называю Myfunction как

    string [] filepath = { "D:\\samplefile\\abc.txt", "D:\\samplefile\\def.txt"}
    MyFunction(2, filepath)

В C ++ функция получает только первый символ filepath.Например, при вызове сверху, если я печатаю в коде C ++, используя

    OutputDebugStringA

, он печатает только D для первого и второго.

Если я удаляю

    [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPTStr)]

из оболочки c # я получу ошибку нарушения доступа в

    w_filepath[i] = (TCHAR *)calloc (1, len) 

для второго файла.

Пожалуйста, помогите мне.

1 Ответ

1 голос
/ 20 мая 2011

1) w_filepath[i] = (TCHAR *)calloc (1, len); - calloc требует размер в байтах, поэтому он должен быть w_filepath[i] = (wchar_t *)calloc (1, len*sizeof(wchar_t));

2) данные из c # представлены как wchar_t *, поэтому вам вообще не нужно преобразовывать подпрограммы, иследует изменить объявление функции на

__declspec(dllexport) bool MyFunction(int num, wchar_t* filepath[])
...