mfc资源数据的使用问题

lunatic7 2020-01-15 01:00:46
在mfc中使用已经导入资源的数据 比如.txt的文本 或者.xml的
HMODULE hLib = AfxGetResourceHandle();
HRSRC hRes = FindResource(hLib, MAKEINTRESOURCE(nId), lpName);
if (hRes == NULL)
{
FreeResource(hRes);
return FALSE;
}
else
{
int nSizeOfIconRes = SizeofResource(hLib, hRes);
HGLOBAL hglobal = LoadResource(hLib, hRes);
if (hglobal)
{
TRACE("%d", nSizeOfIconRes);
//CString temp = (LPSTR)LockResource(hglobal);

return TRUE;
}
}
return FALSE;



tinyxml2 load 好像只有LoadFile( const char* filename ); LoadFile( FILE* );
luaplus好像可以直接loadstring

.txt文件导入资源后 再按行读 或者读到buffer解密 再使用

类似的这种情况 是不是要先转成流 还是我想的太复杂了
...全文
260 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lunatic7 2020-01-18
  • 打赏
  • 举报
回复
引用 12 楼 zgl7903 的回复:

#pragma pack(push, 8)
  typedef struct __FILEX 
  { 
    char *_ptr;
    int   _cnt;
    char *_base;
    int   _flag;
    int   _file;
    int   _charbuf;
    int   _bufsiz;
    char *_tmpfname;
    CRITICAL_SECTION lock;
    
    __FILEX(LPCSTR string)
    {
      memset(this, 0, sizeof(*this));
      InitializeCriticalSection(&lock);
      
      _flag = _IOREAD|_IOSTRG|_IOMYBUF;      
      _ptr = _base = (char *)string;
      _cnt = strlen(string)+1;
    }
    ~__FILEX()
    {
      DeleteCriticalSection(&lock);
    }

    FILE * operator & ()
    {
      return (FILE*)this;
    }
  }__FILEX;
#pragma pack(pop)
这样就缺失了FILE的特性了 不能使用fread fwrite了 学到东西就好了 不纠结这个了 谢谢大佬
zgl7903 2020-01-18
  • 打赏
  • 举报
回复

#pragma pack(push, 8)
  typedef struct __FILEX 
  { 
    char *_ptr;
    int   _cnt;
    char *_base;
    int   _flag;
    int   _file;
    int   _charbuf;
    int   _bufsiz;
    char *_tmpfname;
    CRITICAL_SECTION lock;
    
    __FILEX(LPCSTR string)
    {
      memset(this, 0, sizeof(*this));
      InitializeCriticalSection(&lock);
      
      _flag = _IOREAD|_IOSTRG|_IOMYBUF;      
      _ptr = _base = (char *)string;
      _cnt = strlen(string)+1;
    }
    ~__FILEX()
    {
      DeleteCriticalSection(&lock);
    }

    FILE * operator & ()
    {
      return (FILE*)this;
    }
  }__FILEX;
#pragma pack(pop)
待续_1006 2020-01-16
  • 打赏
  • 举报
回复
学习了
zgl7903 2020-01-16
  • 打赏
  • 举报
回复
标准的定义在 stdio.h 中


#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif


lunatic7 2020-01-16
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
标准的定义在 stdio.h 中

#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
我看了下 stdio.h 可能是vs2017和vs2019的file定义只有那个void* _Placeholder 百度上我也翻了半天 也有人说这个vs2017中file的定义 但是这方法是真的巧 大佬就是大佬 我已经准备妥协了 要是使用CString 要不用CreateFileMapping 我原来想的是会不会有一个针对文本文件的api 像图片png那样去创建流
lunatic7 2020-01-15
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
直接构造一个FILE指针 来使用

{
  typedef struct __FILEX : FILE
  { 
    CRITICAL_SECTION lock;

    __FILEX(LPCSTR string)
    {
      memset(this, 0, sizeof(*this));
      InitializeCriticalSection(&lock);
   
      _flag = _IOREAD|_IOSTRG|_IOMYBUF;      
      _ptr = _base = (char *)string;
      _cnt = strlen(string)+1;
    }
    ~__FILEX()
    {
      DeleteCriticalSection(&lock);
    }
  }__FILEX;
 
  __FILEX str("test");  
  char chBuf2[32];
  fscanf(&str, "%s", chBuf2);
  ASSERT(strcmp(chBuf2, "test") == 0);
}
大佬 我看懂了 也明白了你的意思 这也是我想要的 但是我的mfc中File的结构和你这不一样 定义不了 _flag啥的 #ifndef _FILE_DEFINED #define _FILE_DEFINED typedef struct _iobuf { void* _Placeholder; } FILE; #endif
zgl7903 2020-01-15
  • 打赏
  • 举报
回复
直接构造一个FILE指针 来使用

{
  typedef struct __FILEX : FILE
  { 
    CRITICAL_SECTION lock;

    __FILEX(LPCSTR string)
    {
      memset(this, 0, sizeof(*this));
      InitializeCriticalSection(&lock);
   
      _flag = _IOREAD|_IOSTRG|_IOMYBUF;      
      _ptr = _base = (char *)string;
      _cnt = strlen(string)+1;
    }
    ~__FILEX()
    {
      DeleteCriticalSection(&lock);
    }
  }__FILEX;
 
  __FILEX str("test");  
  char chBuf2[32];
  fscanf(&str, "%s", chBuf2);
  ASSERT(strcmp(chBuf2, "test") == 0);
}
lunatic7 2020-01-15
  • 打赏
  • 举报
回复
我就知道我犯蠢了 我一直在纠结怎么把他转成流格式 然后再file按行读取 其实已经是读取完成后的buffer 我总想着去按行读取.
lunatic7 2020-01-15
  • 打赏
  • 举报
回复
引用 4 楼 走好每一步 的回复:
[quote=引用 3 楼 lunatic7 的回复:] [quote=引用 2 楼 走好每一步 的回复:] [quote=引用 楼主 lunatic7 的回复:] 在mfc中使用已经导入资源的数据 比如.txt的文本 或者.xml的
HMODULE hLib = AfxGetResourceHandle();
	HRSRC hRes = FindResource(hLib, MAKEINTRESOURCE(nId), lpName);
	if (hRes == NULL)
	{
		FreeResource(hRes);
		return FALSE;
	}
	else
	{
		int nSizeOfIconRes = SizeofResource(hLib, hRes);
		HGLOBAL hglobal = LoadResource(hLib, hRes);
		if (hglobal)
		{
			TRACE("%d", nSizeOfIconRes);
			//CString temp = (LPSTR)LockResource(hglobal);

			return TRUE;
		}
	}
	return FALSE;
tinyxml2 load 好像只有LoadFile( const char* filename ); LoadFile( FILE* ); luaplus好像可以直接loadstring .txt文件导入资源后 再按行读 或者读到buffer解密 再使用 类似的这种情况 是不是要先转成流 还是我想的太复杂了
都开源的,即使是LoadFile,后续还要变成buff去解析的[/quote] 其实我问的有点蠢 昨天晚上搞的 脑子有点不转弯 private: char* _charBuffer; 他是读文件到到这个buffer里 这两天熬夜严重 智商下降啊 其实我昨天遇到的问题是 把一个.txt导入 然后再读取解密 我发现我直接粘文本进去和导入.txt的结果不一样。 我又不想再导出成.txt 就引发了一堆bug思维。[/quote] 尽量不要熬夜,不推荐!!![/quote] 如果我导入的.txt文件 还是直接读不出来的 这样直接复制文本到资源的就可以直接读出来 也就是从buffer读一个文件 要怎么读.
走好每一步 2020-01-15
  • 打赏
  • 举报
回复
引用 3 楼 lunatic7 的回复:
[quote=引用 2 楼 走好每一步 的回复:] [quote=引用 楼主 lunatic7 的回复:] 在mfc中使用已经导入资源的数据 比如.txt的文本 或者.xml的
HMODULE hLib = AfxGetResourceHandle();
	HRSRC hRes = FindResource(hLib, MAKEINTRESOURCE(nId), lpName);
	if (hRes == NULL)
	{
		FreeResource(hRes);
		return FALSE;
	}
	else
	{
		int nSizeOfIconRes = SizeofResource(hLib, hRes);
		HGLOBAL hglobal = LoadResource(hLib, hRes);
		if (hglobal)
		{
			TRACE("%d", nSizeOfIconRes);
			//CString temp = (LPSTR)LockResource(hglobal);

			return TRUE;
		}
	}
	return FALSE;
tinyxml2 load 好像只有LoadFile( const char* filename ); LoadFile( FILE* ); luaplus好像可以直接loadstring .txt文件导入资源后 再按行读 或者读到buffer解密 再使用 类似的这种情况 是不是要先转成流 还是我想的太复杂了
都开源的,即使是LoadFile,后续还要变成buff去解析的[/quote] 其实我问的有点蠢 昨天晚上搞的 脑子有点不转弯 private: char* _charBuffer; 他是读文件到到这个buffer里 这两天熬夜严重 智商下降啊 其实我昨天遇到的问题是 把一个.txt导入 然后再读取解密 我发现我直接粘文本进去和导入.txt的结果不一样。 我又不想再导出成.txt 就引发了一堆bug思维。[/quote] 尽量不要熬夜,不推荐!!!
lunatic7 2020-01-15
  • 打赏
  • 举报
回复
引用 2 楼 走好每一步 的回复:
[quote=引用 楼主 lunatic7 的回复:] 在mfc中使用已经导入资源的数据 比如.txt的文本 或者.xml的
HMODULE hLib = AfxGetResourceHandle();
	HRSRC hRes = FindResource(hLib, MAKEINTRESOURCE(nId), lpName);
	if (hRes == NULL)
	{
		FreeResource(hRes);
		return FALSE;
	}
	else
	{
		int nSizeOfIconRes = SizeofResource(hLib, hRes);
		HGLOBAL hglobal = LoadResource(hLib, hRes);
		if (hglobal)
		{
			TRACE("%d", nSizeOfIconRes);
			//CString temp = (LPSTR)LockResource(hglobal);

			return TRUE;
		}
	}
	return FALSE;
tinyxml2 load 好像只有LoadFile( const char* filename ); LoadFile( FILE* ); luaplus好像可以直接loadstring .txt文件导入资源后 再按行读 或者读到buffer解密 再使用 类似的这种情况 是不是要先转成流 还是我想的太复杂了
都开源的,即使是LoadFile,后续还要变成buff去解析的[/quote] 其实我问的有点蠢 昨天晚上搞的 脑子有点不转弯 private: char* _charBuffer; 他是读文件到到这个buffer里 这两天熬夜严重 智商下降啊 其实我昨天遇到的问题是 把一个.txt导入 然后再读取解密 我发现我直接粘文本进去和导入.txt的结果不一样。 我又不想再导出成.txt 就引发了一堆bug思维。
走好每一步 2020-01-15
  • 打赏
  • 举报
回复
引用 楼主 lunatic7 的回复:
在mfc中使用已经导入资源的数据 比如.txt的文本 或者.xml的
HMODULE hLib = AfxGetResourceHandle();
	HRSRC hRes = FindResource(hLib, MAKEINTRESOURCE(nId), lpName);
	if (hRes == NULL)
	{
		FreeResource(hRes);
		return FALSE;
	}
	else
	{
		int nSizeOfIconRes = SizeofResource(hLib, hRes);
		HGLOBAL hglobal = LoadResource(hLib, hRes);
		if (hglobal)
		{
			TRACE("%d", nSizeOfIconRes);
			//CString temp = (LPSTR)LockResource(hglobal);

			return TRUE;
		}
	}
	return FALSE;
tinyxml2 load 好像只有LoadFile( const char* filename ); LoadFile( FILE* ); luaplus好像可以直接loadstring .txt文件导入资源后 再按行读 或者读到buffer解密 再使用 类似的这种情况 是不是要先转成流 还是我想的太复杂了
都开源的,即使是LoadFile,后续还要变成buff去解析的
走好每一步 2020-01-15
  • 打赏
  • 举报
回复
XMLError Parse( const char* xml, size_t nBytes=(size_t)(-1) );

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧