如何将 OpenSSL v3 二进制文件与 Windows 上的应用程序捆绑在一起?

问题描述 投票:0回答:1

如何将 OpenSSL v3 二进制文件与 Windows 上的应用程序捆绑在一起?

有了可执行文件,我有

libcrypto-3-x64.dll
libssl-3-x64.dll

./lib
目录中,我在
DLLs
engines-3
中有
ossl-modules

很好,但是要启动应用程序,我被迫使用

*.bat
文件,其中包含以下内容:

set OPENSSL_MODULES=./lib/ossl-modules
set OPENSSL_ENGINES=./lib/engines-3
start "" my_app.exe %

如何避免使用这个

*.bat
文件,并且只有
my_app.exe
不会产生Windows错误消息?

想补充一下:

int main( int argc, char ** argv )
{
    qputenv( "OPENSSL_MODULES", "./lib/ossl-modules" );
    qputenv( "OPENSSL_ENGINES", "./lib/engines-3" );

并不能解决问题。

还有以下

*.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <environment name="OPENSSL_MODULES" value="./lib/ossl-modules" />
      <environment name="OPENSSL_ENGINES" value="./lib/engines-3" />
    </windowsSettings>
  </application>
</assembly>

也不能解决问题。

谢谢。

windows openssl binaries
1个回答
0
投票

如果

bat
文件有效,但此代码无效:

int main( int argc, char ** argv )
{
    qputenv( "OPENSSL_MODULES", "./lib/ossl-modules" );
    qputenv( "OPENSSL_ENGINES", "./lib/engines-3" );

这意味着您必须在操作系统加载进程之前设置环境变量。

所以就这么做吧。 重新-设置环境值后加载进程:

int main( int argc, char ** argv )
{
    QByteArray envval = qgetenv( "OPENSSL_MODULES" );

    // assumes a "default constructed" QByteArray will
    // return true here - not tested
    if ( ennval.isEmpty() )
    {
        qputenv( "OPENSSL_MODULES", "./lib/ossl-modules" );
        qputenv( "OPENSSL_ENGINES", "./lib/engines-3" );

        execv( argv[ 0 ], argv );
        perror( "execv" );
        exit( 1 );
    }
    .
    .
    .

标题和错误检查已被省略,以使代码示例足够短,因此它没有垂直滚动条。

并且关闭微软的可笑之词,“我们已经弃用了所有我们可以逃脱的便携式非微软产品”“警告”

请注意,这些环境变量假定当前工作目录是该特定

lib
目录的父目录。您可以通过首先查找应用程序二进制文件的绝对路径,然后使用它来确定
lib
目录的绝对路径,来添加相当多的稳健性并删除要求。

© www.soinside.com 2019 - 2024. All rights reserved.