2016-07-09 10 views
-1

このC++エラーは非常に失われています。exeとdllの間のC++呼び出しでエラーが発生しました

".lib"をエクスポートする "exe"が1つあり、この ".lib"をインポートする "dll"を読み込みます。私はこのメソッドwhituoutの問題を使用することができます。しかし、私は "EscapeJson"を使用すると、例外が表示されます。もし私がライブラリにコードをコピーし、 "CoreHelper :: EscapeJson"を "EscapeJson"(同じライブラリ)に置き換えれば、すべてOKです...

何が問題なのですか?

Error

また、コードが動作する

My.EXE (Export) -> My.lib (Import) -> MyDll.dll 
^         | 
    `--------------------------------------- 
、 "EscapeJsonは" 成功した値を返すので...

But code works

エスケープJSONソース

std::string CoreHelper::EscapeJson(char * input, int length) 
{ 
    std::ostringstream o; 
    for (int x = 0; x < length; x++) 
    { 
     char c = input[x]; 
     switch (c) 
     { 
     case '"': o << "\\\""; break; 
     case '\\': o << "\\\\"; break; 
     case '\b': o << "\\b"; break; 
     case '\f': o << "\\f"; break; 
     case '\n': o << "\\n"; break; 
     case '\r': o << "\\r"; break; 
     case '\t': o << "\\t"; break; 
     default: 
      if ('\x00' <= c && c <= '\x1f') 
      { 
       o << "\\u" 
        << std::hex << std::setw(4) << std::setfill('0') << (int)c; 
      } 
      else 
      { 
       o << c; 
      } 
     } 
    } 
    return o.str(); 
} 

答えて

1

std::string(またはその他のPODタイプ以外のもの)をDLL境界に渡すことはできません。この場合、std::stringの元のメモリはEXEの内部に割り当てられ、EXEにコンパイルされたメモリマネージャによって管理されます。 DLLはそれを正しく解放することはできません、EXEのみができます。

DLL境界を越えて安全に使用できる相互運用可能なデータ型とメモリ管理手法を使用する必要があります。

この場合、代わりにもっとこのような何かを試してみてください。

char* CoreHelper::EscapeJson(char * input, int length) 
{ 
    std::ostringstream o; 
    //... 
    std::string s = o.str(); 
    char *res = new char[s.size()+1]; 
    std::copy(s.begin(), s.end(), res); 
    res[s.size()] = 0; 
    return res; 
} 

void CoreHelper::FreeEscapedJson(char * input) 
{ 
    delete [] input; 
} 

char *str = CoreHelper::EscapeJson(...); 
// use str as needed... 
CoreHelper::FreeEscapedJson(str); 
+0

あなたは私のライブを救います!ありがとう! –

関連する問題