C#注册外部dll callbak

时间:2016-02-26 14:12:34

标签: c# pointers dll callback

我使用VisualStudio Community 2015和Visual C#。 我有麻烦才能让签名Pad工作。 这个Pad通过USB和一个" dll"提供是为了获得签名。 好。

我曾经和WinDev一起工作,但我认为回调存在问题...... 所以我决定尝试用C#,但因为我是初学者,我遇到了麻烦。

我创建了一个项目,允许"不安全"代码,编码我的第一个函数是初始化Pad。 它运作良好,因为此调用没有复杂的类型。 它用回调指针加粗。

以下是制造商提供的程序声明的文档摘录: ---一个有效的人:

Format: BYTE uSign300_OpenHid(UINT auiVid, UINT auiPid)
Parameter: auiVid The Vendor ID
auiPid The Product ID
Return: BYTE : 0=FAIL, 1=SUCCESS (these are constants defined earlier)
Example: uSign300_OpenHid(0x0ACD,0x1320);

---这两个给我带来麻烦

Function: uSign300_AddPointHandle
Description: Register a call-back function for StartCapture function, the function will be called when receiving signature data
Format: **BYTE uSign300_AddPointHandle(PSIGN_FUNC func,LPVOID pParam)**
Parameter: func The name of call-back function
The format of PSIGN_FUNC is typedef void **(WINAPI *PSIGN_FUNC)(int*,int, LPVOID)**
The first parameter is data buffer
The second parameter is the length of data.
Please see demo code for more information.
pParam The current pointer
Return: 0=FAIL
Example: uSign300_AddPointHandle(point_handle,this);

现在我的代码:

namespace uSign300ns
{

    public static class retcode
    {
        public const byte SUCCESS = 0x01;
        public const byte FAIL = 0x01;
        public static char sdialog;

    }



    unsafe public class uSign300
    {

        const string _dllLocation = "uSign300Kit.dll";
        [DllImport(_dllLocation)]
        public static extern byte uSign300_OpenHid(uint auiVid, uint auiPid);
        [DllImport(_dllLocation)]
        public static extern bool uSign300_Close();
        [DllImport(_dllLocation)]
        public static extern byte uSign300_ClearSignature();
        [DllImport(_dllLocation)]
        public static extern byte uSign300_AddPointHandle(void* func, void* pParam);
        [DllImport(_dllLocation)]
        public static extern byte uSign300_StartCapture(byte f_Mode, byte f_Interval, byte s_Red, byte s_Green, byte s_Blue, byte b_Red, byte b_Green, byte b_Blue);
        [DllImport(_dllLocation)]
        public static extern byte uSign300_ExitCapture();
        [DllImport(_dllLocation)]
        public static extern byte uSign300_ControlLED(byte leftLED, byte rightLED);

        //
        // --- Méthode d'initialisation
        public static bool __uSign_000_Connect()
        {
            bool bRet = false;
            byte nRet;
            nRet = uSign300_OpenHid(0x0ACD, 0x1320);
            if (nRet == retcode.SUCCESS)
            {
                bRet = true;
            }
            if (bRet)
            {
                // on éteint les LEDs
                uSign300_ControlLED(0x00, 0x00);
            }

            return bRet;
        }


        private void __uSign_callback(void* __ptr_data, int datalen, void* __ptr_dialog)
        {
            MessageBox.Show("Callback appelée");
        }


        public static bool __uSign_100_StartThreadedCapture()
        {
            bool bRet;
            byte nRet;
            //void* __ptr_callback;
            //string sChaine;
            nRet = uSign300_ClearSignature();

            // enregistrer la callback
            fixed (char* __ptr_dialog = &retcode.sdialog) {
                uSign300_AddPointHandle(__uSign_callback, __ptr_dialog);
            }



            bRet = true;
            return bRet;
        }

    }

}

这里是由manufaturer提供的C中的示例代码

void __stdcall point_handle (int *buf, int rev, LPVOID pParam)
{   

    for(int i = 0; i < rev;)
    {
            int point_x;
            int point_y;
            point_x = buf[i++];
            point_y = buf[i++]; 
    }
}

void OnStartcapturing() 
{
    uSign300_AddPointHandle(point_handle,this); 
    AfxBeginThread(ThreadProc_Capture, this);
}

我无法让编辑工作。

非常感谢任何帮助。

非常感谢所有人

PS:对不起,如果我犯了错误,我的英语不够完美

1 个答案:

答案 0 :(得分:0)

至少有一个错误,但我无法保证这是问题的根源。

传递回调函数传递委托,而不是void *:

delegate void PSIGN_FUNC(int* buf, int rev, void* pParam);

然后你将dll调用声明为:

[DllImport(_dllLocation)]
public static extern byte uSign300_AddPointHandle(PSIGN_FUNC func, void* pParam);