0

저는 C++을 처음 사용하여 도움이 필요합니다. 문자열이 들어있는 리소스 전용 dll을 만들었습니다.이 문자열을 다른 프로젝트에서 사용하여 저장된 문자열을 읽어야합니다. LoadString은 쓰는 문자열에 메모리를 할당합니까?

나는 읽기 문자열을 읽기 위해 다음과 같은 기능을 썼다 :

내가 예상 출력을 얻기 위해 내 코드를 변경해야합니까
LPTSTR GetResourceStr(HMODULE resContainer,int resourceID) 
{ 
    //The stings that are stored in the dll are: 
    // 
    //ID   |Value|Caption 
    //__________________________________________ 
    //IDS_STRING101 |101 |stringggg 
    //IDS_STRING102 |102 |string 102 
    //IDS_STRING103 |103 |string 103 

    LPTSTR strBuffer = NULL;//is a (non-const) TCHAR string 
    if(0!=resContainer){ 
     int copied=LoadString(resContainer,resourceID ,(LPTSTR)&strBuffer,0); 
    } 
    return strBuffer; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HMODULE resContainer=LoadLibraryEx(L"ResourceDll.dll",NULL, LOAD_LIBRARY_AS_DATAFILE); 

    LPTSTR msg = GetResourceStr(resContainer,101); 
    std::wcout<<msg<<std::endl; 
    //Expected output: stringggg 
    //The output that i get: stringgggstring 102 string 103 
    int i = 0; 
    std::cin>>i; 
    return 0; 
} 

- stringggg를? 왜 그런 일이 발생합니까? LoadString은 리소스에서 읽은 문자열에 대해 메모리를 할당 했습니까? 아니면 방금 문자열이 이미 저장되어있는 메모리의 위치에 대한 포인터가 있습니까? 도움 주셔서 감사합니다.

+0

LPTSTR []이 필요하므로 버퍼에 문자열을 복사 할 수 있습니다. 마지막 인수는 해당 배열의 크기 여야하며 0은 정확하지 않습니다. 해당 배열을 반환하는 것은 매달려있는 포인터 버그가 될 것입니다. std :: wstring을 반환하는 것을 고려하십시오. –

답변

0

LoadString documentation는 말한다 :

nBufferMax

[에] 유형 : 문자,

버퍼의 크기

을 int로. 문자열이 지정된 문자 수보다 길면 문자열이 잘리고 null로 종료됩니다. 이 매개 변수가 0이면 lpBuffer는 리소스 자체에 대한 읽기 전용 포인터를받습니다.

질문에 직접 대답하기 위해 리소스가 저장된 메모리를 가리키는 포인터 만 있습니다.

그러나 문자열 리소스가 null로 끝나지 않습니다 (자세한 내용은 here 참조). 그래서 그 결과를 얻을 수 있습니다. LoadString의 반환 값은 개별 문자열 리소스의 길이를 알려줍니다. 당신은 널 종료 될 문자열을해야하는 경우에는 다음과 같이 별도의 버퍼에 문자열을 복사 할 수 있습니다

WCHAR* pszString; 
int iLength = ::LoadString(
    resContainer, 
    resourceID, 
    reinterpret_cast<LPWSTR>(&pszString), 
    0 
    ); 

WCHAR* pszString2 = new WCHAR[iLength + 1]; 
::StringCchCopyN(pszString2, iLength + 1, pszString, iLength); 

또는, 당신은 단지 버퍼 (대신 포인터에 대한 포인터로 LoadString를 호출 할 수 있습니다 포인터로)를 3 번째 매개 변수로 사용하고 버퍼의 길이를 4 번째 매개 변수로 지정하여 문자열 리소스를 버퍼에 복사하고 Null로 종료합니다. 단점은 충분히 큰 길이를 전달하지 않으면 문자열이 잘 리게되고 자원의 길이를 미리 쿼리 할 방법이 없다는 것입니다.

+0

정말 고마워, 내 실수를 이해하는 데 정말로 도움이되었다 !! –

관련 문제