0

アンマネージ ポインター (マネージ ラッパーにメンバーとして格納されている) を、ダブル ポインター (格納されているアンマネージ ポインターへのポインター) を必要とするアンマネージ関数に渡すのに問題があります。この問題を以下に示します。

以下に宣言されたアンマネージ C 構造体のラッパーがあります。

   public ref class MyStructWrapper
    {
    private:
    myStruct *_rto;
    public:

    MyStructWrapper()
    {
        _rto = new myStruct();
    }

    // read-only property
    public property RTO{
       myStruct * get(){return _rto;}
    }
    }

C Dll から関数を呼び出す必要があります。

// alters data based on data in "SomeotherStructWrapper"(which consequently holds a 
// SomeOtherStruct* ).

int SomeOtherStructWrapper::AlterMyStruct(myStructWrapper^ myObj)
{

    // unmanaged function in C DLL
    pin_ptr<myStruct> ptr = myObj->RTO;
    AlterMyStructUnmanaged(&ptr,&someOtherStructStoredMemberPtr);


}

目標は、myObj->RTO が指すデータを変更することです...残念ながら、これはコンパイルして実行し、ptr の背後にあるデータを変更しますが、myObj で変更する必要がある実際のデータはそうではありません。

編集:

これは SomeOtherStructWrapper の実装です:

public ref class SomeOtherStructWrapper
    {
    private:
    otherStruct *_ots;
    public:

    MyStructWrapper()
    {
        _ots = new otherStruct();
    }

    int AlterMyStruct(MyStructWrapper ^rto);
 }
}

AlterMyStructUnmanaged の宣言:

__declspec(dllexport) int AlterMyStructUnmanaged
(
    MyStruct **Object,
    otherStruct struct
);

助けてくれてありがとう!

4

1 に答える 1

0

私は間違っているかもしれませんが、ゲッターはポインターのコピーを返します。

したがって、&ptrを使用すると、実際には元のポインターのコピーを指しているため、 myObj インスタンスの元のポインターではなく、コピーを変更します。

ポインターへの参照を返すなど、MyStructWrapper の実装を変更できない場合は、必要なことができない可能性があります。

教祖が決定的な答えを出すのを待ちます...

于 2013-06-05T20:21:07.297 に答える