Если вы передаете указатель на управляемый класс, тогда легко преобразовать ссылку ^ в указатель, но вы должны закрепить управляемый объект, чтобы ГХ не перемещал его в памяти (таким образом, аннулируя указатель)
Это просто с pin_ptr
Однако ваш код выполняет две вещи, которые не будут работать
RTPClient::RTPClient():
mClient(NULL)
{
CIsmaClient::Create(
&mClient, // 1
NULL,
&AllocBuffer,
&GetDataPointer,
this); //2
}
1) Вы пытаетесь получить адрес чего-либо в управляемой куче (расположение указателя на указатель mClient находится в управляемой куче.
Как таковой, он может перемещаться в памяти, таким образом, внутренний указатель поставщика компилятора (значение которого сохраняется в операциях GC). Это должно быть закреплено , и это будет работать только в том случае, если функция Create не ожидает использовать указатель после того, как его область действия закончилась (если он передает его в другое место для хранения, это приведет к ошибкам). 1016 *
2) Вы передаете дескриптор (забавный символ шляпы), а не указатель. (Прочитайте раздел википедии об этом, они являются хорошим обзором) Это не (и не может быть) понято неуправляемым кодом.
Единственная причина, по которой я могу думать об этом параметре в этом контексте, - это явная переменная состояния, передаваемая последующим обратным вызовам функций (исправьте меня, если я ошибаюсь). «this» в этом контексте НИКОГДА не будет работать должным образом, так как это может перемещаться в памяти, как только pin_ptr выходит из области видимости.
Имея это в виду, здесь (частично) исправленная реализация проясняет, что можно, а что нельзя исправлять.
RTPClient::RTPClient():
mClient(NULL)
{
// make it clear you want the address of the instance variable
pin_ptr<CIsmaClient*> pinnedClient = &this->mClient;
CIsmaClient::Create(
pinnedClient, // fixed
NULL,
&AllocBuffer,
&GetDataPointer,
x /* pass something else in */); //2
}
Если вы предоставите больше информации о том, для чего используется последний параметр, я могу предложить возможные решения