2016-02-26 3 views
0

Я использую VisualStudio Community 2015 и Visual C#. У меня проблемы, для того чтобы иметь подпись Pad для работы. Эта панель подключена через USB и для получения подписей предусмотрена «dll». Ну.C# register external dll callbak

Я привык работать с 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; 
     } 

    } 

} 

А вот образец кода в C обеспечивается Manufaturer

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: извините, если я сделал ошибки, мой английский не является совершенным

ответ

0

Есть по крайней мере одна ошибка, но я не могу гарантировать, что это корень проблемы.

Чтобы передать функцию обратного вызова передать делегат, не пустота *:

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

Затем вы объявляете вызов DLL, как это:

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

Спасибо большое. Теперь мой код не показывает ошибок. –

+0

Примите ответ, если это поможет. – Gusman

+0

ОК. сделанный. Я этого не заметил. Прости –