У меня есть нативный dll с управляемой оболочкой, все написано и работает с COM-взаимодействием. Моя работа сейчас состоит в том, чтобы переписать оболочку (и части библиотеки DLL) с помощью c ++ / cli.
Один из методов в нативной dll принимает указатель IStream * output в качестве одного из аргументов, и именно здесь я застрял. Всякий раз, когда я пытаюсь использовать указатель выход , я получаю AccessViolationException .
Вот иллюстрация того, как выглядит мой код:
common.h
class INativeClass
{
public:
virtual int NativeMethod(IStream* output) = 0;
};
c ++ native
#include "common.h"
public NativeClass : public INativeClass
{
public int NativeMethod(IStream* output)
{
outputStream->Write(...); //AccessViolationException happens here
}
}
c ++ удалось
#include "common.h"
public ref class ManagedClass
{
private:
INativeClass* nativeObject;
public:
ManagedClass()
{
nativeObject = CreateNewNativeObject();
}
int ManagedMethod(IStream^ output)
{
NativeClass nativeObject = new
GCHandle streamHandle = GCHandle::Alloc(output);
IntPtr ipo = GCHandle::ToIntPtr(streamHandle);
nativeObject->NativeMethod(static_cast<IStream*>(ipo.ToPointer()));
}
}
с #
void main()
{
ManagedClass managedObject = new ManagedClass();
IStreamImplementation stream = new IStreamImplementation(filepath);
managedObject.ManagedMethod(stream);
}
Я искал в интернете несколько дней и не могу понять, что я делаю неправильно. Я думаю, что я преобразовал в IStream * правильно, и что мне не нужно беспокоиться о GC. Я также пытался использовать pin_ptr , но это не помогло.
Если это дубликат, я прошу прощения, но, как я уже сказал, я уже несколько дней ищу решение.
EDIT
Обновлен код с минимальным компилируемым кодом, который повторяет проблему (может отсутствовать несколько включений).
Также, когда я говорю IStream, я имею в виду InteropServices.ComTypes.IStream или его аналог на С ++. Я не использую std :: istream