记录今天 CDialog Create 失败的原因,

本文记录了一段代码因使用WS_EX_LAYERED风格导致窗口创建失败的问题。文中提到,WS_EX_LAYERED不能作为子窗口的风格使用,去掉该风格后,窗口创建成功。

以前下面的一段代码运行良好,

Dialog dlg;
BOOL bRet = dlg.Create(IDD_XXX, this)

 

今天突然Create创建失败, 找了好久,才发现原来在.rc文件现设了扩展风格:EXSTYLE 0x00080000, 即WS_EX_LAYERED,

而WS_EX_LAYERED是不能做为子窗口风格的(Note that WS_EX_LAYERED cannot be used for child windows)。去掉WS_EX_LAYERED,创建OK。

 

暂且记录下来,以备日后查看。

PendingPath := appFileDir + '\comp\common\extend\taskFiles\Pending\'; ProcessedPath := appFileDir + '\comp\common\extend\taskFiles\Processed\'; if DirectoryExists(PendingPath) = False then begin CreateDirectory(PChar(PendingPath), nil); end; if DirectoryExists(ProcessedPath) = False then begin CreateDirectory(PChar(ProcessedPath), nil); end; if FindFirst(PendingPath+'*.txt',faAnyFile,SearchRec) = 0 then begin repeat TaskID := ChangeFileExt(SearchRec.Name, ''); FilePath := PendingPath + SearchRec.Name; bsLogger.WriteLog('任务文件地址:'+FilePath); TaskFile :=TStringList.Create; try TaskFile.LoadFromFile(FilePath); inParams := TaskFile.Values['inParams']; // TaskValue := GetTaskValue(inParams); TaskValue := doGetPrinterStatus('DS-1870','0'); bsLogger.WriteLog('处理结果:'+TaskValue); TaskFile.Values['TaskValue'] := TaskValue; TaskFile.SaveToFile(FilePath); MoveFile(PChar(FilePath), PChar(ProcessedPath + SearchRec.Name)) finally TaskFile.Free; end; until FindNext(SearchRec) <> 0; FindClose(SearchRec); end; tmrTask.Enabled := True; TaskID := ''; 参考如上代码 修改void CDemoDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1) { int iret = m_GetPrinterStatus("DS-1870", 0); // 获取当前时间 CTime currentTime = CTime::GetCurrentTime(); CString strTime = currentTime.Format(_T("%Y-%m-%d %H:%M:%S")); // 构造日志内容 CString strLog; strLog.Format(_T("[%s] Printer Status: %d\r\n"), strTime, iret); // 写入文件(自动创建+续写) CStdioFile file; if (file.Open(_T("GetPrinterStatus.txt"), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText)) { file.SeekToEnd(); // 定位到文件末尾 file.WriteString(strLog); file.Close(); } } CDialog::OnTimer(nIDEvent); } 使得可以从PendingPath读取txt文件,解出文件中的json的printerName和printerType,填写到doGetPrinterStatus('DS-1870','0')的两个参数对应printerName和printerType,调用m_GetPrinterStatus后在txt文件中填写TaskValue字段并写入文件到ProcessedPath
03-21
// 定时器事件处理函数 void CDemoDlg::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 1) { TCHAR appFilePath[MAX_PATH]; GetModuleFileName(NULL, appFilePath, MAX_PATH); PathRemoveFileSpec(appFilePath); CString appFileDir = appFilePath; CString PendingPath = appFileDir + _T("\\comp\\common\\extend\\taskFiles\\Pending\\"); CString ProcessedPath = appFileDir + _T("\\comp\\common\\extend\\taskFiles\\Processed\\"); if (!PathFileExists(PendingPath)) CreateDirectory(PendingPath, NULL); if (!PathFileExists(ProcessedPath)) CreateDirectory(ProcessedPath, NULL); WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(PendingPath + _T("*.txt"), &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { do { if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { CString FileName = FindFileData.cFileName; CString FilePath = PendingPath + FileName; CString NewPath = ProcessedPath + FileName; CStdioFile TaskFile; if (TaskFile.Open(FilePath, CFile::modeRead | CFile::typeText)) { CStringArray ContentLines; CString Line; while (TaskFile.ReadString(Line)) { ContentLines.Add(Line); } TaskFile.Close(); CString inParamsJson; for (int i = 0; i < ContentLines.GetSize(); i++) { if (ContentLines[i].Left(8) == _T("inParams=")) { inParamsJson = ContentLines[i].Mid(8); break; } } int printerType = 0; CString printerName = _T(""); if (!inParamsJson.IsEmpty()) { try { std::string strJson = CT2A(inParamsJson.GetString()); json j = json::parse(strJson); printerName = CString(j["printerName"].get<std::string>().c_str()); printerType = j["printerType"].get<int>(); } catch (...) { /*bsLogger.WriteLog(_T("JSON解析失败"));*/ } } // 转换字符串编码 CT2A printerNameA(printerName); int iret = m_GetPrinterStatus(printerNameA.m_psz, printerType); BOOL bFound = FALSE; for (int i = 0; i < ContentLines.GetSize(); i++) { if (ContentLines[i].Left(10) == _T("TaskValue=")) { CString newLine; newLine.Format(_T("TaskValue=%d"), iret); ContentLines[i] = newLine; bFound = TRUE; break; } } if (!bFound) { CString newLine; newLine.Format(_T("TaskValue=%d"), iret); ContentLines.Add(newLine); } CStdioFile OutFile; if (OutFile.Open(NewPath, CFile::modeCreate | CFile::modeWrite | CFile::typeText)) { for (int i = 0; i < ContentLines.GetSize(); i++) { OutFile.WriteString(ContentLines[i] + _T("\n")); } OutFile.Close(); } DeleteFile(FilePath); } } } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } } CDialog::OnTimer(nIDEvent); } 修改该函数 改成处理TaskID= inParams=eyJtZXRob2QiOiJHZXRQcmludGVyU3RhdHVzIiwicGFyYW1zIjp7InByaW50ZXJOYW1lIjoiRFMtMTg3MCIsInByaW50ZXJUeXBlIjoiMCJ9LCJ2ZXJzaW9uIjogIjEuMCJ9 TaskValue= 的格式的txt文件,原TaskValue的结果组装成{“result”:“E0001”,“msgaction”:“GetPrinterStatus”,“message”:“6I635Y+W5omT5Y2w5py654q25oCB5aSx6LSlOi0x”}转base64放到message中, 当inParams中的base64解析出来method字段为GetPrinterStatus才调用m_GetPrinterStatus,result成功标识为S0000,TaskID填写为PrinterStatus_54E05B2102DF2E3EC6F80166326DAA86,其中54E05B2102DF2E3EC6F80166326DAA86为printerName的MD5
03-21
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值