用MFC写的OCX,在HTML调用事件有响应,多线程中调用时网页上事件无响应 :用消息通知来更新可以

问题:连接成功后,点交易无事件。但每次点连接都有事件。直接点交易也有事件。好像跟延时有关系。

Sleep(10000)可以,跟延时没关系。
固定参数也无响应,跟参数没关系。
可能是多线程有关系。用消息通知来更新可以。
用MFC写的OCX,在HTML调用事件有响应,多线程中调用时网页上事件无响应 :用消息通知来更新可以_第1张图片

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)应用程序中,你可以使用PostMessageSendMessage函数来向窗口发送消息。以下是带参数的PostMessageSendMessage的示例:

示例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应用程序中使用PostMessageSendMessage向窗口发送自定义消息,并如何通过参数传递数据到消息处理函数中。你可以根据需要修改消息ID和参数类型来满足你的具体要求。记住,在使用SendMessage时,如果消息处理函数没有立即返回,它将会阻塞当前线程,而PostMessage则是异步的。


你可能感兴趣的:(mfc,html,c++)