2

特定の関数を 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

ありがとう、ゴクル。

4

1 に答える 1

4

名前のマングリングと呼び出し規約に注意する必要があります。

したがって、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;
}

この例がうまくビルドされ、実行されると確信しています。

于 2011-08-26T12:42:20.290 に答える