2013-06-05 3 views
0

У меня возникла проблема с передачей неуправляемого указателя (сохраненного как член в управляемой оболочке) неуправляемой функции, требующей двойного указателя (указатель на сохраненный неуправляемый указатель). Эта проблема иллюстрируется ниже:Передача частного элемента указателя на неуправляемую функцию C++/CLI

У меня есть оболочка для неуправляемого структуры 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, нет.

EDIT:

Это реализация 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 
); 

Заранее спасибо за помощь!

+0

Этот вопрос очень похож на этот вопрос http://stackoverflow.com/questions/569690/passing-unmanaged-pointers-in-c-cli ? rq = 1 Но, к сожалению, вызванная функция определяется внутри класса и поэтому может напрямую обращаться к указателю. – GCar89

+0

Можете ли вы показать нам объявление «AlterMyStructUnmanaged»? –

+0

Обновлено с помощью объявления функции C – GCar89

ответ

0

Возможно, я ошибаюсь, но ваш геттер возвращает копию указателя.

Так что, когда вы используете & PTR вы на самом деле указывает на копию исходного указателя, так что вы будете изменять копию, но не оригинальный указатель на экземпляр myObj.

Если вы не можете изменить реализацию MyStructWrapper, например. возвращая ссылку указателю, возможно, вы не сможете делать то, что хотите.

Подождите гуру, чтобы иметь окончательный ответ ...

+0

Думаю, вы можете быть правы ... это было бы неутешительно. Смогу ли я предоставить оболочку в C#, если бы я сделал указатель общедоступной переменной? – GCar89

+0

Если вы используете небезопасный код, это должно быть хорошо, если вы можете его принять. – Pragmateek

+0

В конце концов, мне пришлось изменить свойство, чтобы получить доступ к указателю myStruct для возврата myStruct **. так это выглядит, как собственности MyStruct ** RTO { MyStruct ** получить() {pin_ptr PTR = &_rto; возвращение PTR;}} Спасибо всем за помощь! – GCar89