以下是我将文本文件添加为资源的步骤: 1.右键单击项目,添加新项 2.选择文本文件,单击“添加” 3.转到项目属性,配置属性 - >链接器 - >输入 - >嵌入托管资源文件 4.然后我在文本框中添加了我的文本文件“items.txt
然后在我的.rc文件中,我输入以下代码:
#include "resource.h"
IDR_DATA1 TEXTFILE "Items.txt"
在我的resource.h文件中,我把:
#define TEXTFILE 256
#define IDR_DATA1 255
在我的form1.cpp方法中:
std::string result;
char* data = NULL;
HINSTANCE hInst = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_DATA1), MAKEINTRESOURCE(TEXTFILE));
if (NULL != hRes)
{
HGLOBAL hData = LoadResource(hInst, hRes);
if (hData)
{
DWORD dataSize = SizeofResource(hInst, hRes);
data = (char*)LockResource(hData);
}
else
{
MessageBox::Show("hData is null");
return "";
}
char* pkcSearchResult = strstr(data, "2000000");
if (pkcSearchResult != NULL)
MessageBox::Show(gcnew String(pkcSearchResult));
}
else
MessageBox::Show("hRes is null");
return result;
我不断得到hRes是null,因为某些原因FindResource找不到Items.txt,即使我使用上面的步骤将它添加为资源,任何人都知道为什么FindResource()不起作用?顺便说一下,它编译时没有错误,上面的代码在一个方法中,该方法应该返回包含“2000000”的文本行(我为测试目的而更改了)
答案 0 :(得分:0)
在上述MAKEINTRESOURCE(IDR_DATA1)
函数中交换MAKEINTRESOURCE(TEXTFILE)
和FindResource
的位置似乎有效。
它在以下宽字符变体中的操作方式绕过了上面描述的步骤1 - 4,并且来自@In Silico的solution:
如前所述,将以下语句分别添加到项目rc和resource.h中:
#include "resource.h"
IDR_DATA1 TEXTFILE "Items.txt"
对于带有反斜杠的 $(ProjectDir)转义反斜杠的某个子目录中的“Items.txt”,完全限定的路径也可以使用,但可能无法移植。
#define TEXTFILE 256
#define IDR_DATA1 255
并定义两个函数:
void LoadFileInResource(int name, int type, DWORD& size, const wchar_t *& data) // *& is passing the pointer by reference and not by val.
{
HMODULE handle = ::GetModuleHandleW(NULL);
HRSRC rc = ::FindResourceW(handle, MAKEINTRESOURCEW(name), MAKEINTRESOURCEW(type));
HGLOBAL rcData = ::LoadResource(handle, rc);
size = ::SizeofResource(handle, rc);
data = static_cast<const wchar_t*>(::LockResource(rcData));
//LockResource does not actually lock memory; it is just used to obtain a pointer to the memory containing the resource data.
}
wchar_t GetResource()
{
DWORD size = 0;
const wchar_t* data = NULL;
LoadFileInResource(IDR_MYTEXTFILE, TEXTFILE, size, data);
/* Access bytes in data - here's a simple example involving text output*/
// The text stored in the resource might not be NULL terminated.
wchar_t* buffer = new wchar_t[size + 1];
::memcpy(buffer, data, size);
buffer[size] = 0; // NULL terminator
delete[] buffer;
return *data;
}
data
应提供上述 pkcSearch 查询的widechar实现。