问题:连接成功后,点交易无事件。但每次点连接都有事件。直接点交易也有事件。好像跟延时有关系。
Sleep(10000)可以,跟延时没关系。
固定参数也无响应,跟参数没关系。
可能是多线程有关系。用消息通知来更新可以。
void Callback(int code, const char* info) {
// 处理回调函数的逻辑
// 这里可以添加具体的回调处理代码
//do something
PrintLog("Callback code: %d, info: %s", code, info);
// 将参数传递给消息处理函数
::PostMessage((HWND)pWnd->GetHwnd(), WM_MY_CUSTOM_MESSAGE, static_cast<WPARAM>(code), reinterpret_cast<LPARAM>(info));
//pWnd->OCX_Callback(code, ConvertUnicodeCharToBSTR(info));//回调html
PrintLog("Callback OK");
}
HRESULT CMFCActiveXControlSmartPosCtrl::OCX_Purchase(long amount, BSTR orderNo) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PrintLog("OCX_Purchase");
// 将BSTR转换为char*
_bstr_t bstr(orderNo);
const char* orderNoStr = static_cast<const char*>(bstr);
// 调用DLL接口
Purchase(amount, orderNoStr, Callback);//回调
PrintLog("OCX_Purchase OK");
return S_OK;
}
LONG CMFCActiveXControlSmartPosCtrl::OCX_DisConnectDevice()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: 在此处添加分派处理程序代码
PrintLog("OCX_DisConnectDevice");
return DisConnectDevice();
}
LONG CMFCActiveXControlSmartPosCtrl::OCX_ListDevice(BSTR deviceNameList, VARIANT & deviceNameLen)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// 将BSTR转换为char*
_bstr_t bstr(deviceNameList);
char* deviceNameListStr = static_cast<char*>(bstr);
// 调用DLL接口
ListDevice(deviceNameListStr, &deviceNameLen.intVal);
PrintLog("OCX_ListDevice OK");
return 0;
}
HRESULT CMFCActiveXControlSmartPosCtrl::OCX_ConnectDevice(BSTR deviceName)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
PrintLog("OCX_ConnectDevice");
// 将BSTR转换为char*
_bstr_t bstr(deviceName);
char* deviceNameStr = static_cast<char*>(bstr);
// 调用DLL接口
ConnectDevice(deviceNameStr, Callback);
PrintLog("OCX_ConnectDevice OK");
return S_OK;
}
// 定义处理消息的函数
LRESULT CMFCActiveXControlSmartPosCtrl::OnMyCustomMessage(WPARAM wParam, LPARAM lParam)
{
//CString result = _T("Hello! OCX OK");
//pWnd->OCX_Callback(1, result.AllocSysString());//回调html
int code = static_cast<int>(wParam);
const char* info = reinterpret_cast<const char*>(lParam);
// 在这里使用 code 和 info 进行处理
pWnd->OCX_Callback(code, ConvertUnicodeCharToBSTR(info));//回调html
PrintLog("OnMyCustomMessage OK");
return 0;
}
https://blog.csdn.net/GUMU12345/article/details/120009551 这里也没说太清楚。
MFC消息示例
#define VER_SET_FOCUS WM_USER + 100
ON_MESSAGE(VER_SET_FOCUS, &CWriteSnDlg::OnSetFocus)
protected:
afx_msg LRESULT OnSetFocus(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT CCVersionCompareOnlyDlg::OnSetFocus(WPARAM wParam, LPARAM lParam)
{
thisDlg->GetDlgItem(IDC_EDIT_BTMAC)->SetFocus();
return 0;
}
SendMessage(VER_SET_FOCUS);
示例
在MFC(Microsoft Foundation Class)应用程序中,你可以使用PostMessage
和SendMessage
函数来向窗口发送消息。以下是带参数的PostMessage
和SendMessage
的示例:
示例1:使用 PostMessage
发送自定义消息
// 假设你有一个自定义的消息ID
#define WM_CUSTOM_MESSAGE (WM_USER + 1)
// 在你的窗口类中添加一个处理消息的函数
BEGIN_MESSAGE_MAP(CYourWndClass, CWnd)
// 其他消息处理函数
ON_MESSAGE(WM_CUSTOM_MESSAGE, OnCustomMessage)
END_MESSAGE_MAP()
// 定义处理消息的函数
LRESULT CYourWndClass::OnCustomMessage(WPARAM wParam, LPARAM lParam)
{
// 在这里处理收到的消息,wParam和lParam可以包含参数
int nParam1 = static_cast<int>(wParam);
CString strParam2 = reinterpret_cast<LPCTSTR>(lParam);
// 进行处理
// ...
return 0;
}
// 使用 PostMessage 发送消息
int nParam1 = 42;
CString strParam2 = _T("Hello, MFC!");
// 将参数传递给消息处理函数
::PostMessage(m_hWnd, WM_CUSTOM_MESSAGE, static_cast<WPARAM>(nParam1), reinterpret_cast<LPARAM>((LPCTSTR)strParam2));
示例2:使用 SendMessage
发送自定义消息
// 使用相同的自定义消息ID和消息处理函数定义如上
// 使用 SendMessage 发送消息
int nParam1 = 42;
CString strParam2 = _T("Hello, MFC!");
// 将参数传递给消息处理函数
LRESULT result = ::SendMessage(m_hWnd, WM_CUSTOM_MESSAGE, static_cast<WPARAM>(nParam1), reinterpret_cast<LPARAM>((LPCTSTR)strParam2));
// 等待消息处理函数返回,result 中包含返回值
上述示例演示了如何在MFC应用程序中使用PostMessage
和SendMessage
向窗口发送自定义消息,并如何通过参数传递数据到消息处理函数中。你可以根据需要修改消息ID和参数类型来满足你的具体要求。记住,在使用SendMessage
时,如果消息处理函数没有立即返回,它将会阻塞当前线程,而PostMessage
则是异步的。