Index: branches/egtra/ab5.0/abdev/ab-test/ab-test.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/ab-test/ab-test.cpp	(revision 788)
+++ branches/egtra/ab5.0/abdev/ab-test/ab-test.cpp	(revision 789)
@@ -72,5 +72,5 @@
 		BOOST_CHECK_EQUAL(bmpL.LockBits(&rc, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bdL), Gdiplus::Ok);
 		BOOST_CHECK_EQUAL(bmpR.LockBits(&rc, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bdR), Gdiplus::Ok);
-		
+
 		AB_SCOPE_EXIT({bmpL.UnlockBits(&bdL);});
 		AB_SCOPE_EXIT({bmpR.UnlockBits(&bdR);});
@@ -94,5 +94,17 @@
 }
 
-BOOST_AUTO_TEST_CASE( ResourceLoading )
+UniqueHModule LoadABModule(LPCWSTR name)
+{
+	TCHAR moduleName[MAX_PATH];
+	::GetModuleFileName(nullptr, moduleName, MAX_PATH);
+
+	auto systemDir = fs::path(moduleName).parent_path().parent_path() / L"build/release/system";
+
+	UniqueHModule hmodRes(::LoadLibraryExW((systemDir / name).wstring().c_str(), nullptr, LOAD_LIBRARY_AS_DATAFILE));
+	BOOST_CHECK(hmodRes != nullptr);
+	return hmodRes;
+}
+
+BOOST_AUTO_TEST_CASE( IconResourceLoading )
 {
 	Gdiplus::GdiplusStartupInput gdiplusStartupInput;
@@ -102,19 +114,33 @@
 	AB_SCOPE_EXIT_2(std::bind(Gdiplus::GdiplusShutdown, gdiplusToken));
 
-	TCHAR moduleName[MAX_PATH];
-	::GetModuleFileName(nullptr, moduleName, MAX_PATH);
+	UniqueHModule hmodRes = LoadABModule(L"res.dll");
 
-	auto systemDir = fs::path(moduleName).parent_path().parent_path() / "build/release/system";
+	auto hBasicProgramIconL = (HICON)::LoadImage(hmodRes.get(), MAKEINTRESOURCE(IDI_BASICPROGRAM), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
+	auto hBasicProgramIconR = abres::LoadIcon(hmodRes.get(), IDI_BASICPROGRAM, 16, 16, LR_DEFAULTCOLOR);
 
-	UniqueHModule hmodRes(::LoadLibraryExW((systemDir / "res.dll").wstring().c_str(), nullptr, LOAD_LIBRARY_AS_DATAFILE));
-	BOOST_CHECK(hmodRes != nullptr);
+	BOOST_CHECK(hBasicProgramIconL != nullptr);
+	BOOST_CHECK(hBasicProgramIconR != nullptr);
 
-	auto hBasicProgramIconTarget = (HICON)LoadImage(hmodRes.get(), MAKEINTRESOURCE(IDI_BASICPROGRAM), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
-	auto hBasicProgramIcon = abres::LoadIcon(hmodRes.get(), IDI_BASICPROGRAM, 16, 16, LR_DEFAULTCOLOR);
+	BOOST_CHECK(IconEquals(hBasicProgramIconL, hBasicProgramIconR));
 
-	BOOST_CHECK(hBasicProgramIconTarget != nullptr);
-	BOOST_CHECK(hBasicProgramIcon != nullptr);
+	auto hcurL = ::LoadCursor(hmodRes.get(), MAKEINTRESOURCE(IDC_CURSOR_PEN));
+	auto hcurR = abres::LoadCursor(hmodRes.get(), IDC_CURSOR_PEN);
 
-	BOOST_CHECK(IconEquals(hBasicProgramIconTarget, hBasicProgramIcon));
+	BOOST_CHECK(hcurL != nullptr);
+	BOOST_CHECK(hcurR != nullptr);
 
+	//BOOST_CHECK(IconEquals(hcurL, hcurR));
 }
+
+BOOST_AUTO_TEST_CASE( StringResourceLoading )
+{
+	UniqueHModule hmodRes = LoadABModule(L"res.dll");
+
+	WCHAR strL[1024];
+	::LoadStringW(hmodRes.get(), IDS_DEV_GROUP, strL, ARRAYSIZE(strL));
+
+	boost::optional<std::wstring> strR = abres::LoadString(hmodRes.get(), IDS_DEV_GROUP);
+
+	BOOST_CHECK(!!strR);
+	BOOST_CHECK(strL == *strR);
+}
Index: branches/egtra/ab5.0/abdev/abdev-impl/Resource/Load.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev-impl/Resource/Load.cpp	(revision 788)
+++ branches/egtra/ab5.0/abdev/abdev-impl/Resource/Load.cpp	(revision 789)
@@ -1,5 +1,3 @@
 #include "stdafx.h"
-#include <map>
-#include <tuple>
 #include <Resource/Load.h>
 
@@ -54,4 +52,40 @@
 }
 
+// 文字列リソースの読み込みについては以下を参照。
+// How To Use LoadResource to Load Strings from a String Table
+// http://support.microsoft.com/kb/200893/en-us
+boost::optional<std::wstring> LoadString(HINSTANCE hinst, USHORT id)
+{
+	UINT idRsrcBlk = id / 16 + 1;
+	int strIndex  = id % 16;
+
+	auto hrsrc = FindResourceEx(hinst, RT_STRING, MAKEINTRESOURCE(idRsrcBlk), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));
+	if (hrsrc == nullptr)
+		return boost::none;
+
+	auto hRes = LoadResource(hinst, hrsrc);
+	if (hRes == nullptr)
+		return boost::none;
+	LPCWSTR p = static_cast<LPCWSTR>(LockResource(hRes));
+	if (p == nullptr)
+		return boost::none;
+
+	for (int i = 0; i < strIndex; ++i)
+	{
+		UINT length = *p++;
+		p += length;
+	}
+
+	UINT cch = *p++;
+	if (cch == 0)
+	{
+		return boost::none;
+	}
+	else
+	{
+		return std::wstring(p, cch);
+	}
+}
+
 }}
 
Index: branches/egtra/ab5.0/abdev/abdev-impl/Resource/Load.h
===================================================================
--- branches/egtra/ab5.0/abdev/abdev-impl/Resource/Load.h	(revision 788)
+++ branches/egtra/ab5.0/abdev/abdev-impl/Resource/Load.h	(revision 789)
@@ -3,4 +3,5 @@
 #include <memory>
 #include <windows.h>
+#include <boost/optional.hpp>
 
 namespace ActiveBasic { namespace Resource {
@@ -10,4 +11,6 @@
 
 HCURSOR LoadCursor(HINSTANCE hinst, USHORT id);
+
+boost::optional<std::wstring> LoadString(HINSTANCE hinst, USHORT id);
 
 struct IconDeleter
Index: branches/egtra/ab5.0/abdev/abdev/DialogBoxes.cpp
===================================================================
--- branches/egtra/ab5.0/abdev/abdev/DialogBoxes.cpp	(revision 788)
+++ branches/egtra/ab5.0/abdev/abdev/DialogBoxes.cpp	(revision 789)
@@ -2039,6 +2039,9 @@
 #ifndef THETEXT
 		//ライブラリ開発チーム
-		LoadString(hResInst,IDS_DEV_GROUP,temporary,1024);
-		SetDlgItemText(hwnd,IDC_DEV_GROUP,temporary);
+		boost::optional<std::wstring> devGroup = ActiveBasic::Resource::LoadString(hResInst, IDS_DEV_GROUP);
+		if (devGroup)
+		{
+			SetDlgItemTextW(hwnd, IDC_DEV_GROUP, devGroup->c_str());
+		}
 #endif
 		ApplyDialogTexture(hwnd);
