2016-07-09 2 views
-1

이 C++ 오류로 인해 매우 손실됩니다.exe와 dll 사이의 C++ 호출에서 오류가 발생했습니다

".lib"을 내보내는 "exe"가 하나 있는데이 ".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 경계에서 안전하게 사용할 수있는 interop-safe 데이터 형식 및 메모리 관리 기술을 사용해야합니다. 이 경우

이 대신 비슷한 더 많은 것을 시도 :

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

당신은 내 라이브를 저장! 감사! –

관련 문제