确实为其写入的字符串分配内存



我是C 的新手,需要一些帮助。我创建了一个仅资源的DLL,其中包含字符串,我需要在另一个项目中使用此DLL来读取存储的字符串。

我编写了以下功能来读取读取字符串:

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 ?为什么会发生?是否为从资源读取的字符串分配了内存,或者我只是将指针转到存储器中的位置,字符串已经存储了?感谢您的帮助!

负载串文档说:

nbuffermax [in]

类型:int

在字符中,缓冲区的大小。如果字符串长于指定的字符数量,则将其截断和无效。如果此参数为0,则LPBuffer会收到一个仅读取指针,指向资源本身。

因此,要直接回答您的问题,您只需获取一个指向存储资源的内存的指针。

但是字符串资源不是终止的(有关更多信息,请参见此处),因此这就是为什么您获得该输出的原因。负载串的返回值告诉您各个字符串资源的长度。如果您需要字符串为空终止,则必须将字符串复制到单独的缓冲区,例如:

WCHAR* pszString;
int iLength = ::LoadString(
    resContainer,
    resourceID,
    reinterpret_cast<LPWSTR>(&pszString),
    0
    );
WCHAR* pszString2 = new WCHAR[iLength + 1];
::StringCchCopyN(pszString2, iLength + 1, pszString, iLength);

另外,您只需将指针调用缓冲区(而不是指针指向指针)作为第3个参数,而缓冲区的长度为第4个参数,该参数将将字符串资源复制到缓冲区中并无效。缺点是,如果您的长度不够大,则将截断字符串,并且无法事先查询资源的长度。

相关内容

  • 没有找到相关文章

最新更新