C++ 程序将无法在Visual Studio之外正常运行

C++ 程序将无法在Visual Studio之外正常运行,c++,visual-studio,dll,C++,Visual Studio,Dll,我正在为学校写一个程序,我有一个奇怪的问题,它不能在Visual Studio之外运行。无论是发布还是调试,无论是否带调试运行,它都将在从Visual Studio运行时运行。但是,当我从资源管理器运行它时,它将打开并生成我需要的窗口,但当我运行“实际程序部分”时失败 在上下文中,该程序从许多设备(辐射探测器)获取数据,并进行一些基本处理,以及将原始数据保存到文本文件中。我使用的是硬件供应商提供的DLL和一些ActiveX控件,程序基于它们的示例代码。程序运行时,会出现一个带有“生成”按钮的简单

我正在为学校写一个程序,我有一个奇怪的问题,它不能在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"); }