簡體   English   中英

通過委托從C ++調用C#方法會導致參數反轉

[英]Calling C# Method from C++ via Delegates Results in Reversed Parameters

我試圖讓C ++函數在C#中的表單上調用方法以更新GUI。 由於某些原因,C ++中的函數調用以相反的順序發送參數。

因此,在使用function UpdateDROCallback()調用UpdateDROCallback()函數時,第一個參數為3.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);
}
(...)

顯示TestDll的代碼,尤其是其中的TestDll.RegisterScaleUpdateCallback聲明。 會有原因。 確保調用約定匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM