2016-04-01 10 views
0

安全な方法でDLLの境界を介してCの文字列を返す必要があります。どうすればこのことができますか?dllの境界を通るCの文字列

私の考え:

extern "C" __declspec(dllexport) const char *const Api 
{ 
    ... 
    static const char *output = result.c_str(); 
    return output; 
} 
+0

「結果」とは何ですか?それは*静的変数でもありますか?そのような文字列を返すことは問題ではありません(ただし、あなたが代わりにコピーする引数を渡すことをお勧めします)。問題は、ポインタを返す変数の寿命です。 –

答えて

1

ポインタがあなたのコード例で返されているが、それが指しているメモリ領域が常駐滞在ではないと考えられます。

結果変数(std :: string?)がスタック上にある場合、関数が返ってきたときに破棄され、返されたポインタがぶら下がります。

これを行うには、レスポンスをstrdup()することをお勧めしますが、呼び出し側がC文字列を解放する必要があります。 DLLをアンロードすると、返されたポインタがヒープ変数を指している場合を除き、ダングリングすることになります。他の安全な方法は、/ new'dメモリmallocさ戻っ

extern "C" 
__declspec(dllexport) 
void Api 
    (void (*callback)(const char*)) 
{ 
    callback(str); 
} 

extern "C" 
__declspec(dllexport) 
size_t Api 
    (char* dest, 
    size_t dest_size) 
{ 
    if (dest) 
    strncpy(dest, str, dest_size); 
    return strlen(str); 
} 

ある

1

最も簡単な安全な方法であることは、100%安全ではないDLLとメインプログラムなぜなら異なるランタイムにリンクし、異なるヒープを使用できます。この場合、呼び出し側はDLLの空き/削除を呼び出してメモリを解放/削除できます(DLLはそれらをラップしてラッパーをエクスポートする必要があります)。これは面倒です。

呼び出し元がポインタを格納してDLLをアンロードする可能性があるため、静的メモリを返すことは100%安全ではありません。その場合、ポインタがぶら下がります。

もちろん自動メモリ復帰は100%安全ではありません。

関連する問題