2016-06-30 5 views
1

私は多くの機能を持つDLLを作成するタスクを与えられています。関数の具体的な実装は実際は非常に簡単ですが、一般的な(またはより良い:初期)設定は私に頭痛を与え、私はまだそれを理解することができませんでした。Win32 DLL/Reference stored

long initClient(long* client, char* a = "", char* b = ""); 
long clientSet(int client, const char* a, const char* b); 

最初の関数の意志設定クライアント(0..Nがあることができ、各クライアントが内部状態データを持っている)ので、何とかそれ:だからここに私が実現することになっています機能(多くの)2は、クライアント関連のデータを内部的に追跡する必要があります。私はclientSet(2番目の関数)を呼び出すたびに、initClientから関数に渡す整数値(long *クライアント)を渡す必要があります。そのため、正しいクライアントデータ構造を識別し、そのデータを変更できます。

実際の質問は次のとおりです。これを正しく行うにはどうすればよいですか?

私の現在の解決策は、クライアントの内部リストを関連するデータ/ IDで保持し、クライアントが追加または削除されるたびにmalloc/freeを使用することです。しかし、私はこれがきれいな解決策ではない、あるいはより良い方法で解決できると感じています。

お手数をおかけしますようお願い申し上げます。

編集:それを再考した後、clientSetの最初のパラメータが実際にはinitClient(最初のパラメータ)から得られるポインタである可能性がありますか?これが当てはまる場合、initClientはメモリをいくつかmallocし、データで満たす必要があります。他のすべての呼び出しは、そのメモリ領域を参照するだけです。しかし、同じポインタに対して異なるデータ型を使用することは非常に面倒です(私はint型として解釈する必要があるlong型へのポインタを取得します - 両方がWin32上で4バイトであることを理解しています)。私はここにいますか?

EDIT#2:残念ながら、私はどのような方法でもインタフェースを変更できません。

#3

EDIT:

intptr_t my_ptr; 

long initClient(intptr_t* client, char* a, char* b); 
long clientSet(intptr_t client, char* a, char* b); 

initClient(& my_ptr、 "A"、 "B")は、基本的に(私が必要になります。もっとこの問題について考えた後、多分これは私が実際にした後、午前ものです私は呼び出すことができます今すぐ

*client = (intptr_t)malloc(sizeof(myDataStructure)); 

を行う)を正しく参照解除を行う方法を確認し

clientSet(my_ptr, "X", "Y"); 

これは、私がやるべきことかもしれないように見えますか?

+2

私はあなたに2つのことをお勧めします: 1)あなたの質問にいくつかのコードを公開する、2)すべてのクライアント関連のメソッドでインターフェイスを設計する、DLLをthatsメソッドを実装するクラスを作成し、 __declspec(dllexport)client_interface * GetClientManager(); –

+0

@GerardoSánchez:残念ながら私はインターフェイスを変更することはできません。また、いくつかの説明も追加しました。コードについては、私はまだ何も持っていません。私は何か一緒にハッキングを開始する前に、これを "正しく"行う方法を理解したいと思います。 –

+1

C関数をエクスポートしますが、C++を使用してそれらを実装できます。その場合、必要なすべてのコンテナ(std :: map)を使用して各クライアントのデータを保持することができます。 – AnatolyS

答えて

2

C関数をエクスポートする必要がありますが、C++でそれらを実装できます。その場合、必要なすべてのコンテナとデータ型(std :: map、std :: string)を使用して各クライアントのデータを保持できます。あなたが任意のmalloc関数全くありません見ることができるように:慎重に検討(およびいくつかの議論)した後

struct client { 
    std::string a; 
    std::string b; 
}; 

std::map<long, client> clients; 

extern "C" { 
    long initClient(long* clientid, char* a = "", char* b = "") { 
    // if you need generate clientid you can use static atomic long 
    static std::atomic_long id(0); 
    clients[*clientid = ++id] = client{ a, b }; 
    return *clientid; 
    } 
    long clientSet(int clientid, const char* a, const char* b) { 
    clients[clientid] = client{ a, b }; 
    return clientid; 
    } 
} 
0

は、我々は次の道を行くことにしました:

  • initClientは、mallocされたメモリ領域とリターンを作成しますそのインスタンスへのポインタ(これは将来的には問題になるintとして使用されますが、現在議論中です)
  • すべての関数はそのmalloc'ed領域で動作します
  • 追加のendClient関数が追加されました。無料の予約済みのmem oryスペース。

実際のところ、実際の問題は、ポインタの記憶域としてintを使用していることです。