zoukankan      html  css  js  c++  java
  • VS运行时报0xc000007b错误

    参考:
    https://blog.csdn.net/u010205478/article/details/88682932
    https://www.cnblogs.com/hbccdf/p/dllchecktoolandsyswow64.html
    https://blog.csdn.net/norsd/article/details/81288681

    现状: 一个VS项目,build完成了,运行时却报0xc000007b错误,无法运行!

    查看依赖项

    • 使用开始菜单,输入"VS2015 本地工具命令提示符",运行之.
    • 输入dumpbin /dependents [文件路径],比如要查看c盘根目录下的a.exe就输入dumpbin /dependents "C:a.exe"
    • 发现有几个依赖项;

    检查依赖项是否可以访问到

    • 使用Everything检查这几个依赖项是否存在系统路径"C:WindowsSystem32" and "C:WindowsSysWOW64"里,以及exe同一目录里等;

      根据大佬分析,System32目录存放的是64位的dll, SysWOW64目录存放的是32位的dll. 32位应用程序(exe)等访问System32目录下的任何文件时,会被自动映射到SysWOW64目录. 64位应用程序(exe)可以直接访问两个目录.

    检查依赖项的版本是32位还是64位

    • 如果所有依赖的dll都在能访问到的路径,那么可能是dll的版本与应用程序(32位)不匹配.使用denpends.exe软件(Dependency Walker)可以查看到依赖项DLL的版本,

    使用文本编辑器查看你已有dll的版本也可以: 第2行的PE后面跟的是d,表示64位DLL,如果跟的是L,表明是32位的DLL文件

    • 把该DLL替换成32位版本即可.

    奉劝打包工程的老师们,用心打包一下吧

    本部分参考了 [Unable Access....404]

    1. 首先,打开VS2015 本地工具命令提示符,如果查看b.exe中加载了哪些动态库,可以使用:dumpbin /imports b.exe >2.txt , 此时exe文件所依赖的dll都会写入2.txt。
    2. 将2.txt文件中dll文件名整理,只保留其中的dll文件,按行存储;
    3. 按一下格式写txt,其中,例如D:Opencv 2.4.10opencvuildx86vc12in为dll所在文件夹,C:UsersAdministratorDesktop est为将要打包的文件路径。
    @for /f %%i in (2.txt) do if exist "D:Opencv 2.4.10opencvuildx86vc12in\%%i"  copy "D:Opencv 2.4.10opencvuildx86vc12in\%%i"  C:UsersAdministratorDesktop	est
    
    1. 该格式为bat执行,2.txt中文件被存储到目标文件夹。

    参考https://blog.csdn.net/Q936795779/article/details/81667109/

    • 将依赖动态库复制到 exe 目录下,很简单的工作,用 bat 脚本自动实现。
    • 分析依赖库
    • 找到对应的 dll 文件目录,找不到则记录
    • 复制到当前目录下
    • 分析结果可能不够,提供补充工具,根据名字找到并复制到当前目录下
    1. get_dll.bat

    需搭配add_process.bat使用,即保持同一目录

    功能:

    复制exe到该目录下

    解析dll依赖

    复制dll到该目录下

    @echo off
    echo 应用: 利用vs的dumpbin工具解析依赖dll,并复制到.dll_date目录下。
    echo 原理: 用vs的dumpbin解析dll依赖,where找到dll路径,copy过来。
    echo 使用:	1. cmd下 this + exe file dir
    echo 	2. 提示输入路径。
    echo 补充: 运行时可能仍然缺少某些dll文件,运行add_dll.bat手动补充。
     
    SETLOCAL ENABLEDELAYEDEXPANSION
    set exe_path=%1
    set exe_name=%~n1%~x1
    set /p copy_exe=复制%1到 %~p0 exe_%date:~5,10% 下(y or n)?
    if %copy_exe%==y ( md .exe_%date:~5,10% 2>nul
    copy %1 .exe_%date:~5,10%\%exe_name%)
    set dll_path=dll_%date:~5,10%
    set /p vs_root_path=visual studio 安装根目录(eg.E:VS2015):
    ::set vs_root_path=E:VS2015
    set dumpbin_path=%vs_root_path%VCin
    echo Step1. set dumpbin root: %dumpbin_path%
    echo Step2. set exe file path: %exe_path%
    md .\%dll_path%>nul
     
    echo Step3. 开始解析依赖dll
    %dumpbin_path%dumpbin.exe /dependents %exe_path% | findstr ".dll$" >.\%dll_path%\_dependent_dll_log.txt
     
    echo 解析完毕,总计
    type .\%dll_path%\_dependent_dll_log.txt | find /v /c ""
     
    set /p showlog=展示全部(y or n)?
    if %showlog%==y ( type .\%dll_path%\_dependent_dll_log.txt)
     
    echo Step4. 复制全部dll到 .\%dll_path%
    set /p copyAll=确定(y or n)?
    if not %copyAll%==y ( echo 清除缓存
    del .\%dll_path%*.*
    rd .\%dll_path%
    echo 清理完毕,再见
    goto end )
     
    for /f %%i in (.\%dll_path%\_dependent_dll_log.txt) do ( 
    WHERE %%i 1> .\%dll_path%	emp.txt 2>nul
    if errorlevel 1 ( echo 找不到%%i,记录于.\%dll_path%copy_error_log.txt
    echo %%i>>.\%dll_path%copy_error_log.txt )
    call add_process.bat %%i -off)
     
    del %dll_path%	emp.txt
    echo 复制工作结束
    :end
    pause
    
    1. add_process.bat

    附加处理工具,主要工作是获得txt文本中第一行,并复制dll文件

    @echo off
    set dll_name=%~n1%~x1
    for /f %%j in (.\%dll_path%	emp.txt) do ( if %2==-on echo 开始复制,复制对象:%%j
    copy %%j .dll_%date:~5,10%\%dll_name%
    goto add_end )
    :add_end
     
    ::end add_process to break for loop and get only the first line.
    
    1. add_dll.bat
      补充工具

    功能:

    根据输入dll名字,自动查找并复制到该目录下dll存放文件夹中

    使用:

    直接运行即可

    @echo off
    set dll_path=dll_%date:~5,10%
    set temp=%dll_path%	emp.txt
    md .\%dll_path% 2>nul
    echo 应用:复制dll文件到%dll_path%目录下
    :add_start
    set /p dll_name=输入dll文件名(eg. gflags.dll),q to quit:
    if %dll_name%==q ( goto add_end)
    where %dll_name% 2>nul 1>%temp%
    if errorlevel 1 ( echo 未找到%dll_name%,请重新输入
    goto add_start )else ( echo 找到%dll_name% 于
    type %temp% )
     
    call add_process.bat %dll_name% -on
     
    set /p flag=继续复制dll文件(y or n)?
    if %flag%==y ( goto add_start )else ( echo 再见)
    del .\%temp%
     
    :add_end
    pause
    

    缺哪个DLL,就去http://api.256file.com/这个网站搜索,后面一般都有需要安装什么软件..

  • 相关阅读:
    Sql中CHARINDEX用法
    当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式
    Windows Server 2012 R2安装.NET4.7.2服务问题集合
    详细实例全面解析SQL存储过程
    MySQL 存储过程
    华为远程登陆配置
    数据平台环境部署(mysql、docker、nginx)
    ISIS的路由渗透
    华为模拟器的安装失败(出现40、41、42代码错误,Oracle VM VirtualBox安装出现严重错误以及一直处于开机状态)
    华为模拟器配置动态ospf--虚拟链路、rip重分布、static重分布
  • 原文地址:https://www.cnblogs.com/charleechan/p/13192813.html
Copyright © 2011-2022 走看看