4

DLLと明示的にリンクしようとしています。DLLファイル自体と、クラスとそのメンバー関数に関するいくつかのドキュメントを除いて、他のリソースは利用できません。

ドキュメントから、各クラスには独自のクラスが付属しています

  1. メンバーtypedefの
    例:typedef std::map<std::string,std::string> Server::KeyValueMap, typedef std::vector<std::string> Server::String Array
  2. メンバー列挙の
    例:enum Server::Role {NONE,HIGH,LOW}
  3. メンバー関数の
    例: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について簡単に説明しましたが、この場合の実装方法がわかりません。

アップデート

私は少し混乱しています...(わかりました、わかりました...非常に混乱しています)

  1. (GetProcAddress)を使用する場合にのみ、各パブリックメンバー関数を個別に呼び出しますか?
  2. dll内のクラスを模倣するダミークラスを作成しますか?次に、クラス定義内で、DLLから同等の関数を呼び出しますか?(私はここで意味がありますか?)fnieto、これはあなたがあなたの投稿の最後に私に見せているものですか?
  3. 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のメンバー関数とは異なります。

何か案が?または私はここで間違った写真を撮っていますか...

4

3 に答える 3

3

逆アセンブラを使用して、アセンブリコードからパラメータの種類を把握しようとしない限り、それはできません。これらの種類の情報は、DLLではなく、DLLに付属のヘッダーファイルに保存されます。お持ちでない場合、DLLはおそらくあなたが使用することを意図したものではありません。

于 2009-08-10T08:56:31.660 に答える
0

STL ライブラリは、そのようなコンパイルの境界を越えて使用するようには設計されていません。

できないわけではありませんが、自分が何に夢中になっているかを知る必要があります。

これは、元の DLL とまったく同じコンパイラとバージョン、および同じ設定 (特に DEBUG と RELEASE) で EXE をコンパイルする場合にのみ、DLL の境界を越えて STL クラスを使用しても安全に機能することを意味します。そして、私は「完全に」一致することを意味します。

C++ 標準 STL ライブラリは動作の仕様であり、実装ではありません。異なるコンパイラーや同じコンパイラーの異なるリビジョンでも、コードとデータの実装が異なる可能性があり、異なる場合があります。ライブラリが を返す場合、std::map必ずしも EXE でコンパイルされた STL コードではなく、DLL のバージョンの STL で動作するビットが返されます。

(そして、名前マングリングもコンパイラごとに異なる可能性があるという事実には触れていません)

あなたの状況の詳細がなければ、私には確信が持てません。しかし、これはワームの缶詰になる可能性があります。

于 2009-08-10T18:30:37.060 に答える