3

私のDLLに次の関数があるとしましょう:

void TestFunction(int type, void* data)

その関数は、その DLL をロードするアプリケーションから呼び出されます。アプリケーションは構造体を初期化し、その構造体へのポインターをその関数に送信します。

SampleStruct strc;
TestFunction(DT_SS, &ss);

ここまでは順調ですね。今私を悩ませているのは、メモリ内の strcc 変数を別の構造体に置き換える方法です。私のdllで次のことを行うと:

SampleStruct dllstrcc;
data = &dllstrcc;

dataは新しいdllstrcc構造体を指すようになりましたが、関数が存在し、制御がアプリケーションに戻ると、 strcは依然として最初の構造体を指します。各フィールドを割り当てずに、アプリケーションの構造をdllの構造に置き換えるにはどうすればよいですか:

data.vara = dllstrcc.vara;
data.varb = dllstrcc.varb;
data.varc = dllstrcc.varc;
4

3 に答える 3

2

1. 最も簡単なオプションは、構造体全体をコピーすることです。

void TestFunction(int type, void* data) {
    SampleStruct dllstrcc;
    // fill dllstrcc here...
    SampleStruct *p_ret = data;
    *p_ret = dllstrcc;
}

そしてそれを経由して呼び出す

SampleStruct strcc;
TestFunction(type, &strcc);

利点は、メモリの解放などについて心配する必要がないことです。

2. 本当に呼び出し元の構造を置き換える (新しい構造を持つ) 場合は、DLL に新しい構造を割り当てることができます。

void* TestFunction(int type) {
    SampleStruct* pdllstrcc = new SampleStruct();
    return pdllstrcc;
}

(return新しい構造の方がはるかに簡単なので使用しますが、必要に応じて を使用してパラメーターを介して渡すこともできますvoid** data。)

次のように関数を呼び出すことができます。

SampleStruct *strcc = TestFunction(type);
// do something with the struct
delete strcc;

ポインターを削除することを忘れないでください。そうしないと、メモリ リークが発生します。メモリを解放するのは誰の責任なのか、呼び出し元の責任なのか、DLL の責任なのかを明示的に決定する必要があります。

于 2012-08-10T15:57:26.813 に答える
0

関数を次のように変更できます

void *func(int,void *) 

新しい構造体を返します - ただし、new または malloc を使用してヒープに割り当て、後で呼び出し元が free または delete を使用して解放する必要があることに注意してください。

ところで、デフォルトの代入演算子は必要なことをしませんか?

sampleStruct newStruct;
sampleStruct *tmp=(sampleStruct *)data;
*tmp=newStruct;
于 2012-08-10T15:41:23.340 に答える
-1

c または c++ でコーディングしていますか?

最初: 次のように関数を呼び出したい場合:

SampleStruct strc;
TestFunction(DT_SS, &strc);

できません。を置き換えるとはどういう意味&strcですか? 構造体のアドレスを置き換えようとしていますか? それは意味がありません。また、C ++では使用せず、使用void *しますSampleStruct *

何かを置き換えたい場合は、次のように呼び出す必要があります。

SampleStruct strc;
SampleStruct * pstrc = & strc;
TestFunction(DT_SS, pstrc);

次のように関数を記述すれば、 pstrc を結果に置き換えることができます。

void TestFunction(int type, SampleStruct * & data)

に注意して&ください。これは、ポインター データを参照として渡していることを意味します。は変数ではなく への参照であるため、を記述data = & dllstrcc;して を変更できます。ただし、実際に試す前に、メモリ処理とメモリ リークについて学習しておくことをお勧めします。pstrcdatapstrc

于 2012-08-10T16:43:03.377 に答える