如何从RC资源中得到一个FILE*指针? 在网上找到的都是作为文件写入硬盘,有没有不写入硬盘的方法呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 之前文件是从硬盘上读的,使用fopen得到一个FILE*指针,现在文件直接打包到EXE里了,怎么能再得到一个FILE*指针呢?fopen无法直接读取资源,也没有找到这样的函数。 // 检查并存储Scintilla的dll,如果不存在就释放一个voidCheckScintillaDll( void ){ TCHAR all[ 0x200 ]; size_t i; unsigned char *buf; DWORD size; buf = NULL; _tcscpy( all, __wargv[ 0 ] ); i = _tcslen( all ); while( '\\' != all[ i - 1 ] ) { all[ i - 1 ] = 0; i--; } _tcscat( all + i, _T( "SciLexer.dll" ) ); if( !PathFileExists( all ) ) { // 文件不存在 HRSRC res; HGLOBAL data; void *pdata; HINSTANCE inst = AfxGetInstanceHandle(); res = ::FindResource( inst, MAKEINTRESOURCE( IDR_SCINTILLA_DLL ), _T( "SCINTILLA_DLL" ) ); if( !res ) { return; } data = ::LoadResource( NULL, res ); if( !data ) { return; } size = ::SizeofResource( NULL, res ); pdata = ::LockResource( data ); if( !pdata ) { return; } buf = new unsigned char[ size + 0x100 ]; memset( buf + size - 0x10, 0, 0x100 ); memcpy( ( unsigned char * )buf, pdata, size ); FILE *fp; fp = _tfopen( all, _T( "wb" ) ); if( fp ) { fwrite( buf, 1, size, fp ); fflush( fp ); } fclose( fp ); UnlockResource( data ); FreeResource( res ); return; }} FindResource得到的指针不是FILE*啊,试了一下也不成功。 http://blog.csdn.net/visualeleven/article/details/6035381 buf = new unsigned char[ size + 0x100 ];memset( buf + size - 0x10, 0, 0x100 );为什么要+0x100? 干嘛非得用 FILE *,已经可以获取数据在内存中了的 可能理解上有误,我想应该有两种状况:1)数据文件是作为资源保存在exe文件中,楼上各位已经回答的非常好了;这种情况下我一般是将文件以自定义的二进制资源放在exe文件中;2)数据文件是直接拷贝或追加到exe文件的;这种做法是在打包的时候,除数据被追加到exe文件末尾,还会在数据之后追加诸如32位的数据长度;因此,这样情况下,数据文件获得方式如下:a)由GetModuleFileName获得当前执行文件的文件名;b)由CreateFile、ReadFile、SetFilePointer读取数据的长度;c)由ReadFile读取所需要的数据(SetFilePointer移动文件指针....)d)CloseFile不是很明白LZ说的打包的含义,如果数据真的的是包含在资源文件中,楼上的回答就已经OK了 没有办法,可用的函数接口只认FILE* 怎么把两个文件备份成一个文件,还原的时候成两个文件 擦除icon图标 求助 字符转换问题CString转成char* 文本文档求助,大家过来帮帮忙啊,谢谢 VC动态创建SQL数据库表 (疑惑:)IMAPI在WIN2000中能否调用来刻录光盘?只有WIN XP支持么? 构造函数中不可以用cin>>吗? !谁知道怎么制作VC6.0的向导(wizard) 超高难度:VC通过ODBC访问SQL数据库,使用CListCtrl虚表显示,速度N慢!!如何解决?? 想挣钱,学什么好呢? 窗口的显示视口的问题~! 往一个PBYTE类型的变量中添加字符
void
CheckScintillaDll( void )
{
TCHAR all[ 0x200 ];
size_t i;
unsigned char *buf;
DWORD size; buf = NULL; _tcscpy( all, __wargv[ 0 ] ); i = _tcslen( all );
while( '\\' != all[ i - 1 ] )
{
all[ i - 1 ] = 0;
i--;
} _tcscat( all + i, _T( "SciLexer.dll" ) ); if( !PathFileExists( all ) )
{
// 文件不存在
HRSRC res;
HGLOBAL data;
void *pdata; HINSTANCE inst = AfxGetInstanceHandle();
res = ::FindResource( inst, MAKEINTRESOURCE( IDR_SCINTILLA_DLL ), _T( "SCINTILLA_DLL" ) );
if( !res )
{
return;
} data = ::LoadResource( NULL, res );
if( !data )
{
return;
} size = ::SizeofResource( NULL, res ); pdata = ::LockResource( data );
if( !pdata )
{
return;
} buf = new unsigned char[ size + 0x100 ];
memset( buf + size - 0x10, 0, 0x100 );
memcpy( ( unsigned char * )buf, pdata, size ); FILE *fp; fp = _tfopen( all, _T( "wb" ) ); if( fp )
{
fwrite( buf, 1, size, fp );
fflush( fp );
}
fclose( fp );
UnlockResource( data );
FreeResource( res );
return;
}
}
memset( buf + size - 0x10, 0, 0x100 );为什么要+0x100?
1)数据文件是作为资源保存在exe文件中,楼上各位已经回答的非常好了;这种情况下我一般是将文件以自定义的二进制资源放在exe文件中;
2)数据文件是直接拷贝或追加到exe文件的;这种做法是在打包的时候,除数据被追加到exe文件末尾,还会在数据之后追加诸如32位的数据长度;因此,这样情况下,数据文件获得方式如下:
a)由GetModuleFileName获得当前执行文件的文件名;
b)由CreateFile、ReadFile、SetFilePointer读取数据的长度;
c)由ReadFile读取所需要的数据(SetFilePointer移动文件指针....)
d)CloseFile
不是很明白LZ说的打包的含义,如果数据真的的是包含在资源文件中,楼上的回答就已经OK了