是否有一个有用的Windows资源加载string的C ++包装类?

我们正在努力本地化我们的应用程序,现在已经把所有的硬编码string固定到LoadString()等等。

我已经快速浏览了这个课程,但是想知道是否有人使用过其他好的包装材料。

一些要求/很好拥有:

  • 简洁的硬编码stringreplace – 我们不想添加行和代码行。
  • 免费和免版税

编辑更多的信息 – 硬编码的string都在整个代码。 有时他们被编译器转换为CString,有时转换为std :: string,有时候只是普通的旧char *。

我们希望最小化对代码库(250k +代码行)的更改 – 而且对于所有string被用作不同types的地方都不会太多。

因此类/方法必须做多个职责,如wchar,CString,std :: string等…

我认为一个班级对此是过度的。 我使用这个:

inline const wchar_t * LoadResourceString(UINT resourceId) { wchar_t * buff; int requiredLen = LoadStringW( GetmoduleeHandle(0), // Replace this with your HINSTANCE if // using a resource DLL of course :) resourceId, reinterpret_cast<LPWSTR>(&buff), 0); if (requiredLen == 0) { THROW_LAST_WINDOWS_ERROR(); } return buff; } 

编辑:当然,如果你打算在资源DLL中使用这个,你需要把HINSTANCE放在某个地方。 这假设资源字符串被作为一个单一的二进制文件的一部分。

以下是我使用的:

 extern HINSTANCE GetResourceInstance(); //Define elsewhere, or use a global hInst template<int N> class LoadStringRes { TCHAR tszString[N+1]; public: LoadStringRes(int ID) { ::LoadString(GetResourceInstance(), ID, tszString, sizeof(tszString)/sizeof(tszString[0])); } operator const TCHAR*() const { return tszString; } }; 

如此使用:

 MyFunctionThatNeedsAString(LoadStringRes<100>(IDS_HELLO)); 

它看起来像一个函数调用,但它确实是一个对象的构建/使用/销毁/使用。

缺点是你必须知道弦乐的弹跳长度。 这是自动/堆栈内存分配的价格。

看看wxWidgets 。 它增加你的可分配的设置文件,但它是非常强大的,并提供了很多的功能(除了你正在寻求的)以一个非常优雅和有效的方式(是的,它是免费的和免版税的)。