LoadLibrary для самой вызывающей программы - PullRequest
0 голосов
/ 21 сентября 2011

Я знаю, что под 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) перед функцией, которая тоже не работает.

Я использую VS2010 под Windows 7 Pro x64. Компиляция в виде 32-битного консольного приложения.


Редактировать

Спасибо за указатель на использование GetModuleHandle(NULL) Кэт и Майкл. К сожалению, GetProcAddress, который, я полагаю, мне все еще нужно использовать, все еще возвращает значения NULL. После звонка на GetLastError() я получаю 127 для кода ошибки. Я попытался поместить extern "C" перед функцией, основываясь на немного большем количестве исследований, но я все еще получаю NULL-возврат с кодом ошибки 127.


Редактировать 2

После небольшого поиска кажется, что Visual Studio все равно искажает имена, и мне может понадобиться файл определения, чтобы он соответствовал исполняемому файлу. Есть ли какой-нибудь способ избавиться от лишних ошибок в коде или в Visual Studio?


Редактировать 3

Хорошо. Я, кажется, понял это более или менее. Используя технику, которую я видел в другом коде, я добавил

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

в command.h и обернул в него нужные мне функции, CMDF( func_name ), и, похоже, работает как надо. Пришлось добавить бит __declspec(dllexport), и это, похоже, сработало.

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Дескриптор вашего собственного процесса уже открыт, вы не должны использовать LoadLibrary, чтобы открыть новый.Вместо этого используйте GetModuleHandle (в частности, GetModuleHandle(NULL)) или дескриптор экземпляра из WinMain.

1 голос
/ 21 сентября 2011

Вы можете использовать <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=VS.85).aspx" rel="nofollow">GetModuleHandle</a>(NULL), чтобы получить дескриптор файла * .exe и его символов. Это предпочтительнее и менее хитро, чем полагаться на файл * .exe с определенным путем.

0 голосов
/ 21 сентября 2011

Вы можете проверить, что dllexport что-то сделал. Запустите dumpbin /exports <exe path>, чтобы убедиться, что функция, которую вы пытаетесь найти с помощью GetProcAddress, действительно была экспортирована.

Дампбин входит в состав Visual Studio и наиболее легко вызывается из «командной строки Visual Studio» (см. «Инструменты Visual Studio» в меню «Пуск»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...