Маршалу удалось натянуть [] на неуправляемого персонажа ** - PullRequest
1 голос
/ 20 апреля 2010

Это моя структура c ++ (использовать многобайтовый набор символов)

typedef struct hookCONFIG {
    int threadId;
    HWND destination;

    const char** gameApps;
    const char** profilePaths;
} HOOKCONFIG;

И .Net struct

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct HOOKCONFIG {
    public int threadId;
    public IntPtr destination;

    // MarshalAs?
    public string[] gameApps;

    // MarshalAs?
    public string[] profilePaths;
}

У меня возникла проблема: как мне упорядочить строковый массив? Когда я обращаюсь к переменной структуры "profilePaths" в C ++, я получаю сообщение об ошибке, подобное этому:

Произошло необработанное исключение типа «System.AccessViolationException» в App.exe

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто признак того, что другая память повреждена.

MessageBox(0, cfg.profilePaths[0], "Title", MB_OK); // error ... Orz

1 Ответ

1 голос
/ 20 апреля 2010

Простой способ: изменить прототип на IntPtr []:

public IntPtr[] gameApps;
public IntPtr[] profilePaths;

Теперь, когда вы звоните, вам нужно примерно следующий псевдокод:

GCHandle handle = GCHandle.Alloc(string);
gameApps = new IntPtr[] { GCHandle.ToIntPtr(handle) };

// Unmanaged call

handle.Free();
...