Pergunta

Eu estou trabalhando em envolver um grande número de arquivos .h e .lib de C ++ nativo para C ++ gerenciado para eventual uso como referência .dll em C #.

Algumas das funções nativas C ++ ter um tipo de retorno de void *. Não estou certo como lidar com isso quando eu passar de volta o valor ao meu código de chamada. Por exemplo: se um aplicativo C # chama meu invólucro de dll, o que eu voltar da chamada nativa:

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

Atualmente, estou tentando caixa o retorno em um genérico System :: Object ^ sem sorte. Esta é a chamada na embalagem:

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

Alguém pode oferecer uma solução?

Foi útil?

Solução

Você pode torná-lo um IntPtr? O que você espera do cliente para fazer com o * vazio?

Outras dicas

Se as suas necessidades de código gerenciado para ver os dados no * vazio:

Você não pode lançar a * vazio para não gerenciado memória para uma referência de objeto gerenciado. Para transformar isso em memória gerenciada, você teria que usar Marshal.Copy () ou Marshal.PtrToStructure (). Essa vontade de claro que só funciona se você sabe o tipo dos dados que os pontos de void * para. fonte

Se o seu código gerenciado não precisa ver os dados no * vazio:

Guarde-o em um IntPtr se o seu código gerenciado não precisa ver o que que é e apenas passa-lo de volta para o código não gerenciado mais tarde. fonte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top