安全な方法でDLLの境界を介してCの文字列を返す必要があります。どうすればこのことができますか?dllの境界を通るCの文字列
私の考え:
extern "C" __declspec(dllexport) const char *const Api
{
...
static const char *output = result.c_str();
return output;
}
安全な方法でDLLの境界を介してCの文字列を返す必要があります。どうすればこのことができますか?dllの境界を通るCの文字列
私の考え:
extern "C" __declspec(dllexport) const char *const Api
{
...
static const char *output = result.c_str();
return output;
}
ポインタがあなたのコード例で返されているが、それが指しているメモリ領域が常駐滞在ではないと考えられます。
結果変数(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);
}
ある
最も簡単な安全な方法であることは、100%安全ではないDLLとメインプログラムなぜなら異なるランタイムにリンクし、異なるヒープを使用できます。この場合、呼び出し側はDLLの空き/削除を呼び出してメモリを解放/削除できます(DLLはそれらをラップしてラッパーをエクスポートする必要があります)。これは面倒です。
呼び出し元がポインタを格納してDLLをアンロードする可能性があるため、静的メモリを返すことは100%安全ではありません。その場合、ポインタがぶら下がります。
もちろん自動メモリ復帰は100%安全ではありません。
「結果」とは何ですか?それは*静的変数でもありますか?そのような文字列を返すことは問題ではありません(ただし、あなたが代わりにコピーする引数を渡すことをお勧めします)。問題は、ポインタを返す変数の寿命です。 –