zoukankan      html  css  js  c++  java
  • 天坑!c++调用python,遭遇R6034问题

    起源:

    AllMyTube下载核心,是c#组件调用c++dll,在dll中初始化Python运行环境。在工作目录有msvcr90.dll文件时,程序运行会弹出如下错误:

    R6034。

    ---------------------------
    Microsoft Visual C++ Runtime Library
    ---------------------------
    Runtime Error!
    
    Program: E:...
    
    R6034
    
    An application has made an attempt to load the C runtime library incorrectly.
    Please contact the application's support team for more information.
    
    
    ---------------------------
    确定   
    ---------------------------

    之所以与msvcr90.dll有关,是在测试中加减关联dll发现,未及原理,发布时不带msvcr90.dll

    以为解决问题,其实掩耳盗铃。

    一、幽灵一样的msvcr90.dll

    因为忘记验证,在环境变量任一路径下有msvcr90.dll,亦会弹此错误。上Everything,找不同版本msvcr90.dll做替换问题依旧。

    娘希匹!

    谷歌之,大抵是改此文件名或删除,与我发现类似,未有彻底解决方法。我们不能删除用户机子上环境变量路径中此文件,办不到。

    说是有些第三方软件,把msvcr90.dll装在系统Path目录或装在它自己目录而把其路径加入系统Path中。

    箭在弦上,不得不发,重拾c++,单步追之……

    二、可疑的_AES.pyd

    留意编译信息,发现加载_AES.pyd组件时,有加载python27.dllmsvcr90.dll行为,会不会它搞的鬼?

    单步跟之,异常信息如图:

    托管调试助手“LoaderLock”在“E:AppsDownloadCoreVideoDownloader_v3wininDebugDemo.exe”中检测到故障。
    其他信息: 正试图在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

    且其为反复触发。

    代码中我找到了调用位置,加try...catch(...)屏蔽,无效:

        try{
            pyModule = PyImport_ExecCodeModule("WondershareDownloader", pyScript);
        }
        catch(...){
        }

    怎么办……

    我们应用之python3环境,它却依然去找python27.dll,不该。

    Copy python27.dll至运行目录,亦无效;改_AES.pyd名,可以,不再弹异常框。

    就它丫的鬼!但cookies解密需用此库,如之奈何?

    三、无耻的_AES.pyd

    好,即如此,想替代方案。上Everything,找到另个_AES.pyd,Copy过去:

    29kb那个,是有问题的,30kb这个,没有问题。

    上PyCharm,单步验证此.pyd文件,看替换之后,解密是否如常工作:

    当然不能……

    欲用AES加解密功能,尚需找路。

    以PyCharm启动Python2环境调试无事,启动Python3环境,亦是上面错误。而c++环境,不过是给异常做个转发。

    p2:

    p3:

    直接以python.exe运行之:

    此为问题之源也!

    再看_AES.pyd依赖关系:

    无耻之甚,扰人之极!

    MSVCR90.DLL赫然在列。copy相关文件入执行目录,亦不解决问题,算了吧,不挣扎了……

    四、折衷方案

    肯定是其所用的关联dll未全或版本不对所致。不找了,不麻烦了!

    去了这个_AES.pyd吧,解决眼前问题最重要!有两个网站用到其解密,待时间从容,再做解密研究。

    Google之,stachoverflow上面,亦是处理msvcr90.dll,治标不治本,无多大参考意义

    参考资料:

    Runtime error R6034 in embedded Python application

    C++调用Python2.7出现R6034错误. - 学习笔记 - CSDN博客

  • 相关阅读:
    Windows平台下的读写锁
    进程的阻塞和挂起的区别
    事件函数SetEvent、PulseEvent与WaitForSingleObject详解
    多线程的那点儿事(之多线程调试)
    多线程同步内功心法——PV操作上(未完待续。。。)
    读者写者问题(有bug 后续更改)
    解决VS2010控制台程序运行结束不显示请按任意键继续
    Method has too many Body parameters openfeign
    Eclipse中Cannot nest src folder解决方法
    restTemplate重定向问题 &cookie问题
  • 原文地址:https://www.cnblogs.com/crwy/p/10489817.html
Copyright © 2011-2022 走看看