Python编写的com组件发生R6034错误的原因与解决办法

  • Post category:Python

Python编写的com组件发生R6034错误的原因与解决办法

问题描述

R6034错误 是 Windows 程序在启动时出现的常见错误之一。当使用 Python 编写的 COM 组件运行在 Windows 上时,有时会遇到此类错误,使得组件无法正常运行。

这是因为 Windows 系统和 Visual C++ 运行时库遇到了不匹配的运行时库版本而导致的错误。通常,这种错误的原因是 Python 组件中使用的某些库与 Windows 系统中的不兼容,或者直接与 Windows 系统中的依赖发生了冲突。

解决办法

方案一:使用 Visual C++ Redistributable for Visual Studio

首先要确定问题所处的位置。当 Python 组件在 Windows 平台上无法正常运行时,可以尝试安装 Visual C++ Redistributable for Visual Studio。这样,你的组件就可以在安装运行时组件的计算机上运行了。下载地址:https://aka.ms/vs/16/release/vc_redist.x86.exe。如果你的 Python 组件是 64 位的,需要下载 x64 版本。

如果你的组件成功运行了,那么这很可能是你组件发生 R6034 错误的原因。如果安装此运行时库无法解决问题,请继续阅读后续解决方案。

方案二:调整 Python 编译器的选项

有些时候,Python 编译器的选项可能不在最佳状态,导致了组件和依赖项之间的不兼容。为此,你可以尝试打开并调整编译器选项。

  1. 打开编辑器或 IDE
  2. 打开 Python 项目
  3. 找到并打开 .pyproj 文件
  4. 找到 <PropertyGroup> 元素
  5. 在其中添加以下元素:

xml
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<UseOfMfc>true</UseOfMfc>
<UseOfAtl>true</UseOfAtl>

  1. 保存文件并重新生成整个解决方案

如果这样做解决问题了,那么你的组件应该能够始终正常运行,而不会遇到 R6034 错误。

示例1:解决方案二的代码示例

<PropertyGroup>
  <ConfigurationType>DynamicLibrary</ConfigurationType>
  <PlatformToolset>v142</PlatformToolset>
  <CharacterSet>MultiByte</CharacterSet>
  <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
  <UseOfMfc>true</UseOfMfc>
  <UseOfAtl>true</UseOfAtl>
  <TargetPlatformVersion>10.0.18362.0</TargetPlatformVersion>
  <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>

PropertyGroup 所在节点添加了 RuntimeLibraryUseOfMfcUseOfAtl 元素 。

方案三:使用Manifest文件

如果以上两种方法都没有解决问题,你可以尝试手动编写并使用 Manifest 文件,来指定 Python 和依赖之间的正确性质。

首先,创建一个名称为 python.manifest 的文件,并将以下文本复制粘贴到其中:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version ="8.0.50608.0" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86"/>
        </dependentAssembly>
    </dependency>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version ="9.0.21022.8" publicKeyToken="1fc8b3b9a1e18e3b" processorArchitecture="x86"/>
        </dependentAssembly>
    </dependency>
</assembly>

这个 Manifest 文件可以指定程序依赖的 DLL。当使用 Visual Studio 之类的 IDE 开发时,可以在文件的属性中添加或编辑。如果你手动编写 Manifest 文件,请确保文件与 COM 组件所在目录相同,同时文件名称为 python.manifest

示例2:使用 Manifest 文件的代码示例

<PropertyGroup>
  <ConfigurationType>DynamicLibrary</ConfigurationType>
  <PlatformToolset>v142</PlatformToolset>
  <CharacterSet>MultiByte</CharacterSet>
  <ManifestFile>$(InputName).manifest</ManifestFile>
  <TargetPlatformVersion>10.0.18362.0</TargetPlatformVersion>
  <WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>

PropertyGroup 所在节点添加了 ManifestFile 元素,并设置值为 $(InputName).manifest

总结

以上三种解决方案适用于大多数 Python COM 组件中可能出现的 R6034 错误。首先可以尝试安装依赖程序,其次可以通过调整项目属性和结构来解决,最后可以考虑通过手动编写 Manifest 文件来解决问题。如果以上解决方案均无法解决问题,可以考虑在社区等渠道寻求更高级别的解决方案。