2012-03-28 4 views
2

私は入力char *を取り込み、いくつかの変換操作を実行した後に出力char *を割り当てるCスタイルのDLLインターフェイスを作成しようとしています。関数の戻り値はエラーコードなので、char *を返すためには使用されません。DLLメソッドでCの文字列を返す

私は、このように関数を呼び出す:

char* output; 
myfunc((char *) input.c_str(), &output); 

そして、関数が次のように定義されます

DLL_EXPORT int myfunc(char* input, char** output) 
{ 
    string translation = translate(input); 
    *output = (char *) malloc((translation.length()+1)*sizeof(char)); 
    strcpy(*output,(char *) translation.c_str()); 
} 

が、これは、これを実現するための正しい方法は何ですか?私はメモリリークを作りますか?

答えて

2

正しいですが、メモリを解放する別のDLL機能も提供する必要があります。 DLLをロードした実行可能ファイルが同じバージョンのCランタイムライブラリを使用していると仮定できないので、返されたメモリ上でfreeを呼び出そうとすると、malloc/free実装の違いによりヒープが破損する可能性がありますさまざまなランタイムで

あなたのAPIは、次のようになります。

DLL_EXPORT int myfunc(char* input, char** output) 
{ 
    ... 
    *output = malloc(...); 
    ... 
} 

DLL_EXPORT void myfunc_free(char *output) 
{ 
    free(output); 
} 

allocating and freeing memory across module boundariesを参照してください。

0

あなたはappとdllを呼び出すのと同じヒープスペースを使用するとは決して想定しないでください。この場合、使用する必要がありますWindows Shared Memory object

+0

Huh?同じDLLをロードしている複数のプロセス間でメモリを共有することは、1つのプロセス内で起こりうるメモリリークとは関係ありません。 –

+0

@Adam Rosenfieldは複数のプロセスについて何か言っていましたか?あなたはdllでメモリ割り当てを行い、それをプロセスで使用することを安全と想定していますか?これまで注射DLLを使ってみましたか? – Ulterior

+1

リンクされた記事の最初の文は次のとおりです。 "次の例は、DLLエントリポイント関数がファイルマッピングオブジェクトを使用して** DLLをロードするプロセスによって**共有できるメモリを設定する方法を示しています**"(emphasis mine )。はい、それは完全に安全ですDLL内のメモリを割り当てると、*プロセスで*使用します。それはなぜではないでしょうか?危険なのは、別のモジュールによって割り当てられた1つのモジュールで*メモリの割り当てを解除しようとするときです。リンク先の記事を参照してください。これとDLL注入は何をしなければなりませんか? –

関連する問題