【问题标题】:C++ Load function from DLL into Boost functionC++ 将函数从 DLL 加载到 Boost 函数中
【发布时间】:2011-08-26 11:46:19
【问题描述】:

我想从 DLL 加载特定函数并将其存储在 Boost 函数中。这可能吗?

typedef void (*ProcFunc) (void);
typedef boost::function<void (void)> ProcFuncObj;
ACE_SHLIB_HANDLE file_handle = ACE_OS::dlopen("test.dll", 1);
ProcFunc func = (ProcFunc) ACE_OS::dlsym(file_handle, "func1");
ProcFuncObj fobj = func; //This compiles fine and executes fine
func(); //executes fine
fobj(); //but crashes when called

谢谢, 悟空。

【问题讨论】:

  • 我喜欢你在同一个句子中使用“执行良好”和“崩溃”的方式;)
  • 你能确认func不为空吗?
  • 其实我的意思是下一句像 fobj() 那样调用它会崩溃
  • @Moo-Juice:是的,我看到它是一个有效的函数指针。事实上,调用时它工作正常
  • 你确定不需要在 ProcFunc 上指定调用约定吗?

标签: c++ dll boost-function


【解决方案1】:

你需要小心names mangling and calling convention

所以,在你的 DLL 中:

// mydll.h
#pragma comment(linker, "/EXPORT:fnmydll=_fnmydll@4") 
extern "C" int WINAPI fnmydll(int value);

// mydll.cpp
#include "mydll.h"
extern "C" int WINAPI fnmydll(int value)
{
    return value;
}

然后,在您的 DLL 客户端应用程序中:

#include <windows.h>
#include <boost/function.hpp>
#include <iostream>

int main()
{
    HMODULE dll = ::LoadLibrary(L"mydll.dll");
    typedef int (WINAPI *fnmydll)(int);

    // example using conventional function pointer
    fnmydll f1 = (fnmydll)::GetProcAddress(dll, "fnmydll");
    std::cout << "fnmydll says: " << f1(3) << std::endl;

    // example using Boost.Function
    boost::function<int (int)> f2 = (fnmydll)::GetProcAddress(dll, "fnmydll");
    std::cout << "fnmydll says: " << f2(7) << std::endl;
    return 0;
}

我确信这个示例构建和运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2018-04-21
    • 2012-01-31
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多