私は多くの機能を持つ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:残念ながら、私はどのような方法でもインタフェースを変更できません。
#3EDIT:
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つのことをお勧めします: 1)あなたの質問にいくつかのコードを公開する、2)すべてのクライアント関連のメソッドでインターフェイスを設計する、DLLをthatsメソッドを実装するクラスを作成し、 __declspec(dllexport)client_interface * GetClientManager(); –
@GerardoSánchez:残念ながら私はインターフェイスを変更することはできません。また、いくつかの説明も追加しました。コードについては、私はまだ何も持っていません。私は何か一緒にハッキングを開始する前に、これを "正しく"行う方法を理解したいと思います。 –
C関数をエクスポートしますが、C++を使用してそれらを実装できます。その場合、必要なすべてのコンテナ(std :: map)を使用して各クライアントのデータを保持することができます。 – AnatolyS