void * для Object ^ в C ++ / CLI - PullRequest
       33

void * для Object ^ в C ++ / CLI

3 голосов
/ 20 июля 2009

Я работаю над переносом большого количества файлов .h и .lib из собственного C ++ в Managed C ++ для последующего использования в качестве ссылочного .dll в C #.

Некоторые из собственных функций C ++ имеют тип возврата void *. Я не уверен, как справиться с этим, когда я возвращаю значение в мой вызывающий код. Например: если приложение C # вызывает мою оболочку dll, что я возвращаю из родного вызова:

void* start(ThreadFunc,void *, unsigned *);

В настоящее время я безуспешно пытаюсь упаковать возврат в общий System :: Object ^. Это вызов в обертке:

m_NativeThread->start(cb, 
        GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(),
        static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer())));

Может кто-нибудь предложить решение?

Ответы [ 2 ]

4 голосов
/ 20 июля 2009

Если ваш управляемый код должен видеть данные в пустоте *:

Вы не можете разыграть пустоту * для неуправляемого. память на ссылку на управляемый объект. Чтобы превратить это в управляемую память, вам придется использовать Marshal.Copy () или Marshal.PtrToStructure (). Это воля Конечно, работать, только если вы знаете тип данных, на которые указывает пустота *. источник

Если ваш управляемый код не должен видеть данные в пустоте *:

Храните его в IntPtr, если ваш управляемый код не должен видеть, что это и просто передает его обратно в неуправляемый код позже. источник

0 голосов
/ 20 июля 2009

Можете ли вы сделать это IntPtr? Что вы ожидаете, что клиент сделает с пустотой *?

...