LoadLibrary用于调用程序本身

时间:2011-09-21 08:01:43

标签: c++ windows

我知道在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返回。


编辑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)位,这似乎已经成功了。

3 个答案:

答案 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工具”。)

相关问题