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);
}
(...)
MethodHandle.GetFunctionPointer()를 사용할 수 없습니다. RegisterScaleUpdateCallback() 선언을 변경하여 int 대신 대리자를 사용합니다. –
@ 한증인 감사합니다. 왜 이것이 사실인지 아십니까? 나는 함수 주소가 함수 주소라고 생각했다. – Mills
가비지 수집기 세부 정보 인 관리 코드 실행으로 전환되는 스텁을 거쳐야합니다. 그리고 관리되는 기능에 대한 호출 규칙이 다르다. 인수가 틀린 것으로 보이는 이유입니다. 기본 핵심 메서드는 Marshal.GetFunctionPointerForDelegate()입니다. –