gpt4 book ai didi

c++ - 调用程序本身的 LoadLibrary

转载 作者:行者123 更新时间:2023-11-28 01:03:40 30 4
gpt4 key购买 nike

我知道在 Linux 下,您可以使用 dlopen(NULL, RTLD_*) 获取调用程序的句柄。有没有办法在 Windows 中使用 LoadLibrary 这样做?我试过使用 LoadLibrary(NULL),但它不起作用,句柄变量为 NULL,我也试过指定可执行文件,但似乎也不起作用。

刚才运行以下代码在 handle 中得到了 0x011b0000,但是对 GetProcAddress 的调用仍然返回 NULL。

From commands.h
typedef std::tr1::shared_ptr<command> cmd_ptr;
typedef void (_cdecl *CMD)( creature &, string & );

From commands.cpp
HMODULE handle; // <--- Declared towards top of the file

void load_commands() // <--- Called from main
{
handle = LoadLibrary(L"another-mud-project-src.exe");
std::ifstream cmd_file(COMMAND_FILE);
cmd_ptr cmd;

if( cmd_file.is_open() )
{
std::string tmp, hold;
while( true )
{
cmd_file >> tmp;
if( tmp == "Name" )
cmd_file >> hold;
else if( tmp == "Code")
{
cmd_file >> tmp;
cmd = std::make_shared<command>(hold,tmp);
}
else if( tmp == "Type" )
{
cmd_file >> tmp;
cmd->set_cmdtype(atoi(tmp.c_str()));
if( cmd->is_valid() )
cmd_vec.push_back(cmd);
else
cmd.reset();
}
}
}
}


void command::set_code( string & code )
{
code_ = code;
if( (func = (CMD)GetProcAddress( handle, code.c_str() )) == NULL )
{
std::cerr << "Could not find function name: " << code.c_str() << std::endl;
code_.clear();
}
}

假设我正在做正确的事情,让程序能够很好地处理自己,我需要做什么特别的事情才能让 GetProcAddress 找到所需的函数吗?我什至尝试将 EXP_CMD, #define EXP_CMD __declspec(dllexport), 放在一个函数前面,但它也不起作用。

我在 Windows 7 Pro x64 下使用 VS2010。编译为 32 位控制台应用程序。


编辑

感谢 Cat 和 Michael 关于使用 GetModuleHandle(NULL) 的指点。不幸的是 GetProcAddress,我认为我仍然需要使用它,它仍然返回 NULL 值。在调用 GetLastError() 后,我得到 127 的错误代码。基于更多的研究,我已经尝试将 extern "C" 放在函数前面,但我仍然得到一个错误代码为 127 的 NULL 返回。


编辑2

经过更多搜索后,Visual Studio 似乎仍然会破坏名称,我可能需要一个定义文件来与可执行文件一起使用。有什么方法可以通过代码或在 Visual Studio 中消除这种额外的困惑吗?


编辑3

好的。我似乎或多或少地解决了这个问题。采用我在其他一些代码中看到的技术,我添加了

#define CMDF( name ) \
extern "C" __declspec(dllexport) \
void (name)( creature & ch, string & argument )

进入 commands.h 并将我想要的函数包装在其中,CMDF( func_name ),它似乎按预期工作。必须添加 __declspec(dllexport) 位,这似乎已经成功了。

最佳答案

您自己进程的句柄已经打开,您不应使用 LoadLibrary 打开一个新进程。使用 GetModuleHandle(具体来说,GetModuleHandle(NULL))或来自 WinMain 的实例句柄。

关于c++ - 调用程序本身的 LoadLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496431/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com