2013-05-07 4 views
0

GUI를 업데이트하기 위해 C#의 폼에 메서드를 호출하려고합니다. 어떤 이유로 C++의 함수 호출은 역순으로 매개 변수를 보냅니다.대리자를 통해 C++에서 C# 메서드 호출 반전 된 매개 변수 결과

따라서 UpdateDROCallback() 함수는 함수 (1.0, 2.0, 3.0)를 사용하여 호출 할 때 첫 번째 매개 변수에서는 3.0, 두 번째 매개 변수에서는 2.0, 두 번째 매개 변수에서는 2.0, 마지막 매개 변수에서는 1.0을 얻습니다.

무엇이 여기에 있습니까?

[C 번호]

public partial class Form1 : Form 
    { 
     delegate void DROUpdateDelegate(double x, double y, double z); 
     DROUpdateDelegate m_DROUpdateDelegate; 
     static DROUpdateDelegate s_DROUpdateDelegate; 

     public Form1() 
     { 
      InitializeComponent(); 
      m_DROUpdateDelegate = new DROUpdateDelegate(UpdateDROCallback); 
      s_DROUpdateDelegate = new DROUpdateDelegate(UpdateDRO); 
     } 

     private void btnGo_Click(object sender, EventArgs e) 
     { 
      int address = m_DROUpdateDelegate.Method.MethodHandle.GetFunctionPointer().ToInt32(); 
      TestDll.RegisterScaleUpdateCallback(address); 
     } 

     private static void UpdateDROCallback(double x, double y, double z) 
     { 
      s_DROUpdateDelegate(x, y, z); 
     } 

     private void UpdateDRO(double x, double y, double z) 
     { 
      BeginInvoke(
       new Action(
        () => 
        { 
         lblDROX.Text = x.ToString("0.0000"); 
         lblDROY.Text = y.ToString("0.0000"); 
         lblDROZ.Text = z.ToString("0.0000"); 
        })); 
     } 
    } 

TestDll.cs :

public static class TestDll 
{ 
    (...) 
    [DllImport("test.dll", EntryPoint = "RegisterScaleUpdateCallback")] 
    public static extern void RegisterScaleUpdateCallback(int address); 
    (...) 
} 

[C++]

StrobeTest.h :

#pragma once 
class StrobeTest 
{ 
    typedef void (__stdcall *DROUpdate)(double x, double y, double z); 

private: 
    static DROUpdate s_CallbackFunction; 
public: 
    StrobeTest(void); 
    ~StrobeTest(void); 

    static void InitializeStrobe(void); 
    static void MoveXAtSpeed(double velocity); 
    static void CALLBACK RegisterScaleUpdateCallback(DROUpdate function); 
}; 

StrobeTest.cpp

(...) 
void StrobeTest::RegisterScaleUpdateCallback(DROUpdate function) 
{ 
    StrobeTest::s_CallbackFunction = function; 
    StrobeTest::s_CallbackFunction(1.0, 2.0, 3.0); 
} 
(...) 
+0

MethodHandle.GetFunctionPointer()를 사용할 수 없습니다. RegisterScaleUpdateCallback() 선언을 변경하여 int 대신 대리자를 사용합니다. –

+0

@ 한증인 감사합니다. 왜 이것이 사실인지 아십니까? 나는 함수 주소가 함수 주소라고 생각했다. – Mills

+0

가비지 수집기 세부 정보 인 관리 코드 실행으로 전환되는 스텁을 거쳐야합니다. 그리고 관리되는 기능에 대한 호출 규칙이 다르다. 인수가 틀린 것으로 보이는 이유입니다. 기본 핵심 메서드는 Marshal.GetFunctionPointerForDelegate()입니다. –

답변

1

TestDll의 코드, 특히 TestDll.RegisterScaleUpdateCallback의 코드를 표시하십시오. 그 원인이있을거야. 호출 규칙이 일치하는지 확인하십시오.