Я знаю, что под 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)
, и это, похоже, сработало.