DLLと明示的にリンクしようとしています。DLLファイル自体と、クラスとそのメンバー関数に関するいくつかのドキュメントを除いて、他のリソースは利用できません。
ドキュメントから、各クラスには独自のクラスが付属しています
- メンバーtypedefの
例:typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
- メンバー列挙の
例:enum Server::Role {NONE,HIGH,LOW}
- メンバー関数の
例:void Server::connect(const StringArray,const KeyValueMap), void Server::disconnect()
グーグル検索からのコードを実装して、私はdllをロードすることができ、切断関数を呼び出すことができます。
dir.h
LPCSTR disconnect = "_Java_mas_com_oa_rollings_as_apiJNI_Server_1disconnect@20";
LPCSTR connect =
"_Java_mas_com_oa_rollings_as_apiJNI_Server_1connect@20";
上記の関数名はdepends.exeから取得しました。これは、C ++で装飾/マングルされた関数名と呼ばれるものですか?
main.cpp
#include <iostream>
#include <windows.h>
#include <tchar.h>
#include "dir.h"
typedef void (*pdisconnect)();
int main()
{
HMODULE DLL = LoadLibrary(_T("server.dll"));
pdisconnect _pdisconnect;`
if(DLL)
{
std::cout<< "DLL loaded!" << std::endl;
_disconnect = (pdisconnect)GetProcAddress(DLL,disconnect);
if(_disconnect)
{
std::cout << "Successful link to function in DLL!" << std::endl;
}
else
{
std::cout<< "Unable to link to function in DLL!" << std::endl;
}
}
else
{
std::cout<< "DLL failed to load!" << std::endl;
}
FreeLibrary (DLL);
return 0;}
dll自体でパラメータデータ型が宣言されている 接続メンバー関数を(たとえば)呼び出すにはどうすればよいですか?
編集
より詳しい情報:
- DLLには、Javaを使用した実装例が付属しています。Javaの例には、SWIGとソースコードを使用して生成されたJavaラッパーが含まれています。
- ドキュメントには、すべてのクラス、それらのメンバー関数、およびそれらのデータ型がリストされています。ドキュメントによると、リストはC ++ソースコードから生成されました。(??)
- 他の情報は提供されませんでした(DLLの生成に使用されたコンパイラに関する情報はありません)
私の同僚は、与えられたJavaの例に基づいてJavaを使用してインターフェースを実装していますが、C++を使用して実装するように依頼されました。DLLはサードパーティの会社のものです。
コンパイラについて聞いてみます。私が彼らから得るべき他の情報はありますか?
JNIについて簡単に説明しましたが、この場合の実装方法がわかりません。
アップデート
私は少し混乱しています...(わかりました、わかりました...非常に混乱しています)
- (GetProcAddress)を使用する場合にのみ、各パブリックメンバー関数を個別に呼び出しますか?
- dll内のクラスを模倣するダミークラスを作成しますか?次に、クラス定義内で、DLLから同等の関数を呼び出しますか?(私はここで意味がありますか?)fnieto、これはあなたがあなたの投稿の最後に私に見せているものですか?
- DLLからクラス全体をインスタンス化することは可能ですか?
最初の投稿で説明した接続機能を使おうとしていました。Depends.exe DLLの出力から、
- std :: map // KeyValueMapには次のメンバー関数があります:del、empty、get、has_1key、set
- std :: vector // StringArrayには次のメンバー関数があります:add、capacity、clear、get、isEMPTY、reserve、set、size
これは、私のコンパイラ(VS 2005)のmapおよびvectorのメンバー関数とは異なります。
何か案が?または私はここで間違った写真を撮っていますか...