- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道在 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 返回。
经过更多搜索后,Visual Studio 似乎仍然会破坏名称,我可能需要一个定义文件来与可执行文件一起使用。有什么方法可以通过代码或在 Visual Studio 中消除这种额外的困惑吗?
好的。我似乎或多或少地解决了这个问题。采用我在其他一些代码中看到的技术,我添加了
#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/
按安卓版本安卓 2.3.3 - 2.3.7 385 65.5%安卓 4.2 155 26.4%安卓 4.3 28 4.8%安卓 4.0.3 - 4.0.4 20 3.4% 按设备擎天柱 L3 (e0)
如果我使用 Win32 API LoadLibrary 连续 3 次加载相同的 DLL,它应该返回 3 个不同的句柄,并且每个库中的函数都应该有不同的地址,对吗? (或者它会做一些“智能”的事情并检测
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我很难理解为什么 C++ 中同时需要 #include 和 LoadLibrary()。在 C++ 中,“#include”强制预处理器将 #include 行替换为您包含的文件的内容(通常是包含声明
我知道在 Linux 下,您可以使用 dlopen(NULL, RTLD_*) 获取调用程序的句柄。有没有办法在 Windows 中使用 LoadLibrary 这样做?我试过使用 LoadLibra
我有一个由 Jet excelsior 生成的 .dll,我试图从它们生成的调用 dll 中提取类。我正在关注他们最初用 c 语言完成的示例脚本。尽管进行了数小时的研究和故障排除,但我无法启动 Loa
我的目录结构如下: test dir a.dll <-- version 1 a.dll <-- version 2 myapp.exe 我预计 LoadLibrary("
我主要是一名 .net 开发人员,用 C++ 做一些小事,所以我遇到了一些麻烦。 我正在使用 hInst = LoadLibrary(TEXT("mydll.dll")); 加载另一个 C++ dll
if (LoadLibrary(L"d:\\cwebpage.dll")) MessageBox(0, L"Loaded", L"ERROR", MB_OK); else Message
我在想如果有几个类来包装 LoadLibrary 和 GetProcAddress、Library 和 Function struct Function { Function(Library&
来自 MSDN : The system maintains a per-process reference count on all loaded modules. Calling LoadLibr
我正在使用 Code::Blocks 并且讨厌手动链接 DLL。我找到了 LoadLibrary()功能,我想知道它是否像 .a 一样工作或 .lib文件会。这个功能是这样工作的吗?如果没有,我可以通
我的代码使用 LoadLibraryA("someDLL.dll");它开始搜索文件 someDLL.dll 的路径是什么?另一个问题:LoadLibraryA 函数是否区分大小写?我的意思是如果我有
我正在使用 CreateRemoteProcess 将一些汇编程序代码注入(inject)远程进程(64 位),然后加载一个 dll,但我在 LoadLibraryA 中得到一个 C0000005 E
我正在尝试使用 LoadLibrary(...) 函数,它接收一个字符串到文件名(.dll 或 .exe)或文件路径。我遇到的问题是文件名本身有多个句点/点。 例子: HINSTANCE hInst
是否可以在调用 LoadLibrary() 时静默捕获错误弹出窗口,例如“过程入口点 xxx 无法位于动态链接库 xxx 中”? 最佳答案 您可以通过调用 SetErrorMode() 来抑制错误弹出
我一直在做 JNA有一段时间了。但是有一件事,我一直没明白。例如,在加载库时: Map options = new HashMap(); options.put(Library.OPTION_CALL
我正在修复其他人的代码并注意到该人多次调用 LoadLibrary,如下所示: LoadLibrary("C:\\Windows\\SysWOW64\\msjint40"); LoadLibrary(
我给了我的软件用户一个从打开文件对话框中选择dll的机会。(这样我的用户就可以从我的网站下载dll并将其与主项目一起使用)。一切工作正常,它甚至可以发现 dll 是由我提供的或选择了无效的 dll。但
我一直在尝试使用 C++ 加载 32 位 dll(从 32 位应用程序,在 Windows 7 64 位上)。 LoadLibrary 返回 NULL,GetLastError 返回 126,表示“找
我是一名优秀的程序员,十分优秀!