2013-04-28 1 views
2

관리되지 않는 코드에서 관리되는 메서드를 호출하려고합니다. 그러나 관리되는 코드에서는 '(__clrcall) 호출 규칙을 사용해야하며 관리되지 않는 C++ 코드는/clr 옵션을 사용하지 않고 __clrcall 호출 규칙을 사용하지 않습니다. 관리되지 않는 프로젝트가 관리 대상으로 변경되지 않기 때문에 제가하고 싶다고 생각하지 않습니다.관리되지 않는 C++에서 Managed CLI 메서드를 호출하는 호출 컨텍스트에 집착하지 않음

CodeGuru 및 MSDN에서 본 것처럼 위임자와 함수 포인터 마샬링을 모두 관리했지만이 오류는 여전히 정적 함수를 __stdcall 규칙을 사용하여 호출하지 않는 한 팝업됩니다 ref 클래스. 이 메소드는 ref 클래스의 인스턴스 여야합니다.

내가이 문제를 해결할 수 있었던 유일한 방법은 어셈블리에서 관리되지 않는 코드에서 호출 후 ESP 레지스터를 팝하는 것을 건너 뛰는 것입니다 (4 개 추가). 호출에 인수에 하나의 매개 변수가 있습니다. 그러므로 '4'). 그렇게하면 효과적으로 __clrcall을 수행 할 수 있습니다. 그 옵션은 큰 시간을 악취.

아무도이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 반드시 가능해야합니다. 간단하지만 핵심적인 정보가 누락되었습니다. 여기

 delegate void OxpOnReceivedMeasurement(std::vector<OBX> *obxes); 

내가

 void LocalOxpMeasurementCallback(std::vector<OBX> *obxes); 

를 호출 할 인스턴스 방법 그리고 여기에 마샬링입니다 : 여기

내 대리인 정의는 (이 모두가 하나의 심판 클래스 ManagedSensor에 속하는)입니다 ref 클래스 생성자에서 수행되는 관리되지 않는 함수에 대한 ref 클래스 함수의 변경 :

// Now to make the 'delegate' unmanaged function pointer usable for unmanged code 
    // The argument is the unmanaged callback. 
    OxpOnReceivedMeasurement ^oxpMeasurementCallbackFP = gcnew OxpOnReceivedMeasurement(this, &ManagedSensor::LocalOxpMeasurementCallback); 
    // Lock it so the garbage collector doesnt get rid of it or move it 
    gch = GCHandle::Alloc(oxpMeasurementCallbackFP); 
    // Pass the marshaled function pointer to the unmanaged code 
    IntPtr ip = Marshal::GetFunctionPointerForDelegate(oxpMeasurementCallbackFP); 
    // fnOnReceiveMeasurement is defined in OxpLibTransports.h which matches the delegate 
    // this passes the function pointer to the unmanaged Sensor class to be used when a 
    // measurement is received 
    _sensor->RegisterForMeasurementCallback((fnOnReceiveMeasurement)(ip.ToPointer())); 

누군가가이 문제에 대한 좋은 대답을 가지기를 바랍니다. 나는 아마 어리석은 뭔가를 놓치고있다.

답변

6

지원됩니다. 특성을 사용하여 CLR에 대리자에 대해 만든 썽크가 __cdecl 호출 규칙을 사용해야한다고 알릴 수 있습니다. 다음과 같이 설정하십시오.

using namespace System::Runtime::InteropServices; 

[UnmanagedFunctionPointer(CallingConvention::Cdecl)] 
delegate void OxpOnReceivedMeasurement(std::vector<OBX> *obxes); 
+0

감사합니다. 24 시간 이내에 2 번. 이것은 하나의 add esp, 4 문장을 날려 버리는 인라인 어셈블리보다 훨씬 좋았습니다. 매우 감사. –

관련 문제