问题描述
我正在为一个游戏使用内部Mod菜单,并且我想使用DLL中的CPR库在注入后从服务器获取最新版本的偏移。现在,我获得了带有vcpkg的CPR软件包的静态版本,并将所有.lib文件和包含文件移动到我的项目中,并将它们添加到我的include和lib目录中,并像这样使用它:
#pragma once
#pragma comment(lib,"crypt32.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"zlib.lib")
#pragma comment(lib,"libcurl.lib")
#pragma comment(lib,"cpr.lib")
#include "cpr/cpr.h"
cpr::Response r = cpr::Get(cpr::Url{ "https://myurl.com/getoffset" });
cout << r.status_code << endl;
cout << r.text << endl;
string json= r.text;
它工作正常,没有任何问题,但是您可以看到所有这些“ #pragma comment”都有些混乱,因此我尝试使用动态版本的CPR,因此在编译后我有3个DLL文件:
- myMode.dll
- libcurl.dll
- zlib1.dll
现在的问题是,我必须在“ .exe”文件附近的游戏文件夹中放入“ zlib1.dll”和“ libcurl.dll”,否则它将无法注入;有什么方法可以将它们定位在我的DLL中并告诉DLL使用该位置?
还是像这样使用它,但是以某种方式删除此“ #pragma注释”并在Visual Studio中为所有这些对象添加位置?
解决方法
您需要了解的所有有关DLL搜索路径的信息都是well documented here。
最简单的方法是仅静态链接libcurl和zlib,而不使用DLL存根库。这样做的缺点是什么?
否则,所有依赖的DLL都必须位于EXE文件夹,当前工作目录(通常与EXE文件夹相同),系统目录(否!)或PATH中。
如果您的扩展程序具有安装程序,则可能只是使用DLL的安装文件夹及其所有依赖项来更新PATH。
对于“混乱” pragma comment
语句。标准方法是通过Visual Studio项目IDE添加它们。这样可以更好地控制链接搜索路径,因此您不必将所有stub .lib文件都转储到构建时所在的文件夹中。