Я использую 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: извините, если я сделал ошибки, мой английский не является совершенным
Спасибо большое. Теперь мой код не показывает ошибок. –
Примите ответ, если это поможет. – Gusman
ОК. сделанный. Я этого не заметил. Прости –