C++ 程序将无法在Visual Studio之外正常运行
我正在为学校写一个程序,我有一个奇怪的问题,它不能在Visual Studio之外运行。无论是发布还是调试,无论是否带调试运行,它都将在从Visual Studio运行时运行。但是,当我从资源管理器运行它时,它将打开并生成我需要的窗口,但当我运行“实际程序部分”时失败 在上下文中,该程序从许多设备(辐射探测器)获取数据,并进行一些基本处理,以及将原始数据保存到文本文件中。我使用的是硬件供应商提供的DLL和一些ActiveX控件,程序基于它们的示例代码。程序运行时,会出现一个带有“生成”按钮的简单框。点击此按钮将打开相同的窗口,每个窗口可用于连接到不同的探测器。在进行一些设置更改后,可以在每个设置上点击“开始”,开始一个线程,该线程会不时轮询设备以获取数据等。当“开始”按钮被激活时,程序崩溃C++ 程序将无法在Visual Studio之外正常运行,c++,visual-studio,dll,C++,Visual Studio,Dll,我正在为学校写一个程序,我有一个奇怪的问题,它不能在Visual Studio之外运行。无论是发布还是调试,无论是否带调试运行,它都将在从Visual Studio运行时运行。但是,当我从资源管理器运行它时,它将打开并生成我需要的窗口,但当我运行“实际程序部分”时失败 在上下文中,该程序从许多设备(辐射探测器)获取数据,并进行一些基本处理,以及将原始数据保存到文本文件中。我使用的是硬件供应商提供的DLL和一些ActiveX控件,程序基于它们的示例代码。程序运行时,会出现一个带有“生成”按钮的简单
我用C++和MFC。< /P> 我能从整件事中得出的唯一错误是: 0xC0150010:正在停用的激活上下文对于当前执行线程不是活动的
有什么想法吗?我能提供其他有用的信息吗 编辑1:int nResponse=dlg.DoModal()代码>
这是堆栈跟踪中的唯一代码位,一旦它中断,这就是我的代码中的任何内容
我运行了Dependency Walker并向目录中添加了几个DLL文件:
mcbcio32.dll
mcbloc32.dll
ieshims.dll
编辑2:
Dependes.exe不再出现错误
以下是“开始”代码:
void ccranewodlg::OnStart()
{
CStatic*pLatest=(CStatic*)GetDlgItem(IDC_最新版本);
CEdit*pFilePath=(CEdit*)GetDlgItem(IDC_FILEPATH);
CString strFilePath,strText;
CFile数据文件;
我的头;
LPTSTR errText=“lol”;
试一试{
pFilePath->GetWindowText(strFilePath);
如果(!dataFile.Open(strFilePath,CFile::modeCreate | CFile::modeReadWrite,NULL)){
AfxThrowOleDispatchException(0xab,(LPCTSTR)“文件打开不工作”,0);
}否则{
//锁定dropbox,设置设备。
//TODO:锁式升降箱
压板->设置窗口文本((LPCSTR)m_连接命令((LPCSTR)“停止”);
pLatest->SetWindowText((LPCSTR)m_conctl.Comm((LPCSTR)“全部清除”);
pLatest->SetWindowText((LPCSTR)m_连接命令((LPCSTR)“开始”);
UpdateInfo();
//写真正的标题
MakeHeader(&myHeader);
dataFile.Write(&myHeader,256);
dataFile.Close();
//结束实数报头
//开始获取数据
//AfxBeginThread((AFX_THREADPROC)GetData,(LPVOID)&数据文件,线程优先级_NORMAL,0,0,NULL);//在按下stop时,使用线程ID关闭它
//GetData(&dataFile);//使其成为具有循环的线程
//使用CThread
CEdit*pSize=(CEdit*)GetdGitem(IDC\U大小);
CEdit*pEvery=(CEdit*)GetDlgItem(IDC_EVERY);
CEdit*pMax=(CEdit*)GetDlgItem(IDC_MAX);
pSize->GetWindowText(strText);
m_Size=_tstof(strText);
pEvery->GetWindowText(strText);
m_Every=_tstof(strText);
pMax->GetWindowText(strText);
m_Max=_tstof(strText);
m_FilePath=strFilePath;
m_Address=m_DListCtl.GetSelAddress();
OutputDebugString(“我们将在这里启动线程\n”);
m_DataThread.m_pDlg=这个;
m_DataThread.Start();
//TODO:线程
//GetData();
//dataFile.Close();
}
}捕获(COleDispatchException*pE){
pE->GetErrorMessage(errText,30,空);
pE->Delete();
压板->设置窗口文本(errText);
}
UpdateInfo();
//m_连接通信((LPCSTR)“停止”);
}
谢谢很可能,当前工作目录不同,因此工作目录也不同。可能正在加载不同版本的设备库
在排除这些问题时,通常会很有帮助。我这样做了,谢谢。这并不能解决我眼前的问题,但我确实找到了一些“丢失”的DLL文件,并将它们放在目录中。@user667840:您是否尝试了“分析模式”,该模式在程序运行时监视DLL加载,并向您显示调试输出?此选项变灰。我使用的特定计算机是x64,但我是为x86编译的;这就是原因吗?@user:你必须使用与你的应用程序比特数相匹配的Dependency Walker版本,所以在64位Windows上,你通常会同时安装这两个版本。哈哈,我真傻。当我运行x86版本时,错误就消失了。但是程序仍然不能正确运行。这不是DLL的问题。异常代码通常由线程问题引起,例如从创建对话框的线程以外的线程关闭对话框。您对创建线程的代码进行了注释,它是否与您测试的实际代码匹配?此代码就是我现在拥有的,是的。我曾经有过一些有趣的时间让线程为这个硬件工作;这很可能就是问题所在。所有的UI都在一个线程中,新线程不与对话框交互。(…或者不应该。我会再次检查。)线程只通过一些控件轮询硬件并创建一些文件(UI线程未打开)。
void CCraneWowDlg::OnStart()
{
CStatic *pLatest = (CStatic *)GetDlgItem(IDC_LATEST);
CEdit *pFilePath = (CEdit *)GetDlgItem(IDC_FILEPATH);
CString strFilePath, strText;
CFile dataFile;
LISHDR myHeader;
LPTSTR errText = "lol";
try {
pFilePath->GetWindowText(strFilePath);
if (!dataFile.Open(strFilePath, CFile::modeCreate | CFile::modeReadWrite, NULL)){
AfxThrowOleDispatchException(0xab,(LPCTSTR)"file open not work",0);
} else {
//lock the dropbox, set up the device.
//TODO: lock dropbox
pLatest->SetWindowText((LPCSTR)m_ConnCtl.Comm((LPCSTR)"STOP"));
pLatest->SetWindowText((LPCSTR)m_ConnCtl.Comm((LPCSTR)"CLEAR_ALL"));
pLatest->SetWindowText((LPCSTR)m_ConnCtl.Comm((LPCSTR)"START"));
UpdateInfo();
//write the real header
MakeHeader(&myHeader);
dataFile.Write(&myHeader,256);
dataFile.Close();
//end real header
//begin getting data
// AfxBeginThread((AFX_THREADPROC)GetData,(LPVOID)&dataFile,THREAD_PRIORITY_NORMAL,0,0,NULL); //TODO use thread ID to close it if stop is pressed
// GetData(&dataFile); //make this a thread with a loop
//use CThread
CEdit *pSize = (CEdit *)GetDlgItem(IDC_SIZE);
CEdit *pEvery = (CEdit *)GetDlgItem(IDC_EVERY);
CEdit *pMax = (CEdit *)GetDlgItem(IDC_MAX);
pSize->GetWindowText(strText);
m_Size = _tstof(strText);
pEvery->GetWindowText(strText);
m_Every = _tstof(strText);
pMax->GetWindowText(strText);
m_Max = _tstof(strText);
m_FilePath = strFilePath;
m_Address = m_DListCtl.GetSelAddress();
OutputDebugString("here we are about to start the thread\n");
m_DataThread.m_pDlg = this;
m_DataThread.Start();
//TODO: thread
// GetData();
// dataFile.Close();
}
} catch(COleDispatchException *pE) {
pE->GetErrorMessage(errText, 30, NULL);
pE->Delete();
pLatest->SetWindowText(errText);
}
UpdateInfo();
// m_ConnCtl.Comm((LPCSTR)"STOP");
}