我使用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:对不起,如果我犯了错误,我的英语不够完美
答案 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);