0

我一直在调试 gpgme。当我将日志级别提高到 9 时,我得到了发生错误的确切位置。

GPGME 2017-06-02 16:25:42 <0x3968>  gpgme_op_export_keys: enter: ctx=08A19D68, mode=0x10, keydata=089C4578
GPGME 2017-06-02 16:25:42 <0x3968>  gpgme_op_export_keys: check: ctx=08A19D68, keys[0] = 089C4190 (9E799EB266729E930BE7A22B7650B73C8AD5436D)
GPGME 2017-06-02 16:25:42 <0x3968>  gpgme_op_export_keys: error: Invalid value <GPGME>

我有一个使用 gpgme 的 c++ 库。当我在 Boost.Test 应用程序中使用该库时,不会发生错误。当我在 C# 应用程序中使用该库时,会发生错误。

我正在做的是从我的钥匙圈中导出一个私人 ascii 装甲钥匙。它始终是同一个指纹。我可以从这里去哪里,我需要在 gpgme 上验证以找出差异吗?


编辑:我有关于该问题的其他信息。我用我的应用程序重新分发了一些 gpgme 文件。即:libassuan-0.dll, libgpg-error-0.dll, libgpgme-11.dll.

当我将整个安装复制到同一个文件夹中时,相同的调用运行没有错误。

这让我相信当我加载库时有一个后台设置正在运行。为我阅读文档gpgme_set_global_flag可以看到有一些条目引用gpgconf

为了让我的应用程序能够以正确的配置运行,我需要导出什么?

编辑 2: gpgme.log 在临时文件夹创建中不同于成功运行和失败运行。

好的:

_gpgme_io_spawn: check: path=00444FB8, CreateProcess ready: hProcess=000005D0, hThread=000005CC, dwProcessID=6184, dwThreadId=16268

坏的:

_gpgme_io_spawn: check: path=001850E8, CreateProcess failed: ec=87

两个文件夹都遵循相同的命名方案。我不确定这里出了什么问题。

编辑:我慢慢地陷入了精神错乱。设置似乎不确定。偶尔按预期设置功能。有时它不会。我确保我有最新的库 - 安装了 gpg4win 并从那里复制了库 - 现在调试日志要么不显示调试条目,要么 gpg 停止一起寻找路径。当我尝试使用 OpenPGP 时,它现在会在稍后阶段失败。我估计原因还是一样的。

4

1 回答 1

0

标准安装路径包含空格。

C:\Program Files (x86)\GNU\GnuPG\gpgconf.exe

看起来好像 gpgme 没有正确处理。看起来路径没有为CreateProcess调用而包装。

作为修补程序,我添加gpgconf.exe到自定义客户端的执行路径中。

gpgme对首先在此路径中查找的文件进行检测。

这样,当CreateProcess被调用时,路径中没有空格并且调用成功。

这只是一个修补程序,因为我的客户现在需要确保他不会将我的应用程序安装在带有空格的路径中。


编辑:再次取消标记。它工作了一会儿,现在 gpgme 已经停止调用gpgconf.exe. 所以很自然地现在有一个不同的错误。


....现在一切又突然好起来了。

所以我想唯一正确的解决方案就是把整个事情扔到窗外。

于 2017-06-07T11:14:05.870 回答