0

私はC++で新しく、助けが必要です。 私は、文字列を含むリソースのみのdllを作成しました。私は格納された文字列を読み込むためにこの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; 
} 

iは、期待される出力を得るために私のコードでは何を変更する必要があります - stringgggを? どうしてですか? LoadStringは、リソースから読み込んだ文字列にメモリを割り当てるか、文字列がすでに格納されているメモリ内の場所へのポインタを取得しましたか? ご協力ありがとうございます!

+0

LPTSTR []が必要なので、文字列をバッファにコピーできます。最後の引数はその配列のサイズでなければならず、0は決して正しくありません。その配列を返すことは、ぶら下がりポインタのバグです。 std :: wstringを返すことを検討してください。 –

答えて

0

LoadString documentationは言う:

nBufferMax

[中]の型:int

バッファのサイズ、文字に。指定された文字数より長い場合、文字列は切り捨てられ、ヌル文字で終了します。このパラメータが0の場合、lpBufferはリソース自体への読み取り専用ポインタを受け取ります。

質問に直接答えるには、リソースが格納されているメモリへのポインタを取得するだけです。

しかし、文字列リソースはNULLで終端されていません(詳細はhereを参照)。そのため、その出力が得られます。 LoadStringの戻り値は、個々の文字列リソースの長さを示します。あなたは、NULLで終了する文字列が必要な場合は、このように、別のバッファに文字列をコピーする必要があります。

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はを呼び出すことができますポインタに)、バッファの長さを4番目のパラメータとして指定します。これにより、文字列リソースがバッファにコピーされ、NULL終了します。欠点は、十分な長さを渡さなければ文字列が切り捨てられ、あらかじめリソースの長さを問い合わせる方法がないことです。

+0

ありがとう、本当に私の間違いを理解するのに役立った!! –

関連する問題