我知道在Linux下你可以使用dlopen(NULL,RTLD_ *)来获取调用程序的句柄。有没有办法在Windows中使用LoadLibrary?我已经尝试使用LoadLibrary(NULL),它不起作用,handle变量为NULL,我已经尝试过指定可执行文件,但似乎也没有工作。
现在运行以下代码会在0x011b0000
中找到handle
,但对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位控制台应用程序。
感谢您使用GetModuleHandle(NULL)
Cat和Michael的指针。不幸的是,我认为我仍然需要使用的GetProcAddress
仍然返回NULL值。在那里打了GetLastError()
的电话后,我得到了127个错误代码。我已经尝试将extern "C"
放在函数前面,基于更多的研究,但我仍然得到一个带有错误代码127的NULL返回。
经过一些搜索后,似乎Visual Studio仍然会破坏名称,我可能需要一个定义文件来与可执行文件一起使用。有没有办法通过代码或在Visual Studio中摆脱那些额外的修改?
好的。我似乎已经或多或少地解决了这个问题。采用我在其他一些代码中看到的技术,我添加了
#define CMDF( name ) \
extern "C" __declspec(dllexport) \
void (name)( creature & ch, string & argument )
进入commands.h并在其中包含我想要的函数CMDF( func_name )
,它似乎正在按预期工作。不得不添加__declspec(dllexport)
位,这似乎已经成功了。
答案 0 :(得分:2)
您自己的流程的句柄已经打开,您不应该使用LoadLibrary
打开一个新句柄。请改用GetModuleHandle
中的GetModuleHandle(NULL)
(具体为WinMain
)或实例句柄。
答案 1 :(得分:1)
您可以使用GetModuleHandle(NULL)
来获取* .exe文件及其符号的句柄。与依赖具有特定路径的* .exe文件相比,这是首选且不那么笨拙。
答案 2 :(得分:0)
您可能想查看dllexport是否已执行任何操作。运行dumpbin /exports <exe path>
以检查您尝试使用GetProcAddress定位的函数是否实际已导出。
dumpbin包含在Visual Studio中,最容易通过“Visual Studio命令提示符”调用(请参阅开始菜单中的“Visual Studio工具”。)