【发布时间】:2016-12-02 19:07:05
【问题描述】:
我想编写一个非常非常小的程序来解析启动参数并选择几个 DLL 中的一个来“启动”。
我已经编写了一个应用程序,我想将其作为 DLL “运行”,方法是将其编写为应用程序,然后更改 Visual Studio 项目属性以将其构建为 DLL。我知道我需要同时使用 LoadLibrary 和 GetProcAddress 来获得我想要的功能,但是我很难找到关于这方面的清晰和全面的文档,因为很多用例并不是真正的这种性质。另外,我必须根据项目和平台限制走这条路线。
我找到了this page,其中有一些信息,但不够清楚,我无法适应我的目的。
编辑:这就是我现在所处的位置。
我有一个 DLL 项目,其主函数签名如下所示:
__declspec(dllexport) int cdecl main(int argc, char *argv[])
我还有一个应用程序项目,它尝试加载 DLL 并运行上述函数如下所示:
typedef int (CALLBACK* LPFNDLLFUNC1)(int, char *);
...
HMODULE dllHandle = NULL;
BOOL freeResult, runTimeLinkSuccess = FALSE;
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
if (args->IsEmpty())
{
dllHandle = LoadLibrary(L"TrueApplication.dll");
if (NULL != dllHandle)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(dllHandle, "main");
if (lpfnDllFunc1)
{
int retVal = lpfnDllFunc1(0, "1");
}
目前,LoadLibrary 调用有效,但 GetProcAddress 无效。
【问题讨论】:
-
您认为将其设为 DLL 而不是 EXE 的优势是什么?我们必须知道您的推理,因此我们不推荐“取消”您正在寻找的某些 DLL 优势的解决方案。
-
使用这种方法既不是我的选择,也不是我的想法,但鉴于平台和项目的限制,这是我必须要做的。本质上,如果我使用多个可执行文件而不是 DLL,我将不得不对这个平台进行等效于为每个可执行文件完全拥有不同的应用程序条目。例如,用户必须安装“Launcher”应用以及“App 1”、“App 2”等。
标签: c++ dll loadlibrary getprocaddress