2016-12-02 45 views
1

我是C++的新手dll的概念,只是想知道,是否有可能編寫一個C++ .dll庫來導出寫入命名空間和類中的方法?是否可以編寫一個C++ .dll庫來導出名稱空間和類中寫入的方法?

我已經試過......

/*JNLib.h Header File*/ 
#ifndef __JNLIB_H__ 
#define __JNLIB_H__ 
#include <string> 
#include <vector> 
using namespace std; 

    namespace JNLib 
    { 
     class __declspec(dllexport) JNLibClass 
     { 
     public: 
       void split_string(); 
     }; 
    } 

#endif 

和.cpp文件

/*JNLib.cpp File*/ 
#include "stdafx.h" 
#include "JNLib.h" 

    namespace JNLib 
    { 
     void JNLibClass::split_string() 
     { 
      cout<<"Library called"<<std::endl; 
     } 
    } 

裏面現在我能夠編譯這個項目,併成功獲得.dll文件。在另一個項目中,我可以通過使用LoadLibrary()方法成功加載庫(.dll)文件,但GetProcAddress方法每次都返回空值。我寫的代碼是

typedef void (CALLBACK *f_funci)(); 
HINSTANCE dllinstance = LoadLibrary(L"..\\myLIB\\JNLib.dll"); 
f_funci funci = (f_funci)GetProcAddress(dllinstance, "split_string"); 

請讓我知道我做錯了什麼。

+0

查找符號損壞。您也可以使用Windows上的dumpbin工具(隨Visual Studio提供)來檢查實際導出的符號名稱。 – OMGtechy

+2

除了[name-mangling](https://en.wikipedia.org/wiki/Name_mangling)問題,您還有另一個加載該函數的問題。問題是你試圖加載一個非靜態成員函數,因爲它是一個非成員函數。非靜態成員函數需要調用* object *。 –

+0

爲什麼不包含頭文件(使用'dllimport'而不是'dllexport')並鏈接到dll? –

回答

1

庫中沒有符號split_string - 名稱爲mangled

您可以使用DLL上的dumpbin工具來查看導出的符號。或者,您可以將要導出名稱空間/類的內容移動到extern "C"塊中(這可以阻止名稱變形)。

0

可以從DLL的命名空間中導出一個方法。

首先,您的命名空間定義你的方法,並作爲@OMGtechy上面寫道 - 添加extern "C"裝飾:

namespace MyNameSpace{ 
    extern "C" void foo(); 
} 

其次,編輯您的項目def文件來指定命名空間映射:

LIBRARY MyDllName 
EXPORTS 
    MyNameSpace::foo=foo 

現在,當加載你的方法時指定你的名字空間:

typedef void(*PFN_MYFUNC)(); 

HINSTANCE hLib = ::LoadLibrary("MyDllName"); 
PFN_MYFUNC pfn = (PFN_MYFUNC)::GetProcAddress(hLib, "MyNameSpace::foo"); 
相關問題