IntPtr
можно преобразовать в void*
и из него, но это не тот же тип.
Поскольку параметр является только внешним, простое решение заключается в использовании временного:
void* pRootStorage;
StgCreateStorageEx(
context->marshal_as<WCHAR*>(path),
STGM_READWRITE & STGM_CREATE,
STGFMT_DOCFILE,
0,
&stgOptions,
NULL,
IID_IStorage,
&pRootStorage);
cf->pRootStorage = IntPtr(pRootStorage);
На самом деле это будет немного быстрее, потому что пиннинг не требуется.
У вас также есть отдельная проблема с синтаксисом неверных функций-членов.Вы хотите
static CompoundFile^ Create(String^ path)
вместо
CompoundFile CompoundFile::Create(String^ path)
и не забудьте
return cf;
Тогда marshal_context
не является ref class
, поэтомуэта строка неверна:
marshal_context^ context = gcnew marshal_context();
Вместо этого используйте
marshal_context context;
и, поскольку это не указатель,
context.marshal_as<WCHAR*>(path)