Попытка маршалировать указатель C ++ на unsigned long в C # ulong - PullRequest
1 голос
/ 08 сентября 2011

У меня есть C ++ DLL, которую я пытаюсь связать с использованием C #.У меня нет доступа к исходному коду DLL, поэтому его нельзя изменить.Один из методов, которые мне нужно вызвать, содержит указатель на unsigned long:

int __stdcall Foo(FooHandle messageHandle, unsigned long* tag, char* part, char* value)

Я создал тестовый проект DLL с той же сигнатурой метода, так что я могу попытаться выяснить это, но не смогбыл в состоянии заставить DLL изменить значение unsigned long, на которое ссылается указатель, и вернуть это значение на стороне C #.Объявление на стороне C #:

[DllImport("Foo.dll", EntryPoint = "Foo", CallingConvention = CallingConvention.StdCall)]
    public static extern int Foo(int messageHandle, IntPtr tag, StringBuilder part, StringBuilder value);

Когда я делаю вызов из C #, а затем пытаюсь преобразовать IntPtr в Int32 или Int64, я получаю ноль.Я искал здесь и в сети в целом, а также MSDN и не могу найти объяснение того, как это сделать.Я подумал, что char * будет сложной частью, но StringBuilder просто работает.

Как вы можете использовать C ++ DLL, которая изменяет значение unsigned long, которое передается указателем?помощь будет оценена.Спасибо.

1 Ответ

4 голосов
/ 08 сентября 2011

Просто используйте uint, переданный ref:

public static extern int Foo(int messageHandle, ref uint tag, StringBuilder part, StringBuilder value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...