VC 程序内嵌资源

资源导入:

直接在ResourceView页使用import...就可以。
//-----------------------------------------------------------------------------------
资源使用:

/*在导入资源时由于swf格式文件并非VC的标准资源,所以在导入时需要在“Resource type”栏指定资源类型“SWF”,特别需要注意的是在此必须要包含引号。加入到资源后可以通过资源视图看到导入的SWF资源是以二进制形式保存的,一但加入就不能再通过资源视 图对其进行编辑了。

   在使用SWF资源前首先要将其动态从应用程序中释放到文件中才可对资源做进一步的使用。可先通过宏MAKEINTRESOURCE()将资源标识号IDR_SWF转换成字符串Name,再分别通过FindResource()、LoadResource()函数查找、装载该资源到内存:
*/
LPTSTR Name = MAKEINTRESOURCE(IDR_SWF);// IDR_SWF资源名称。

HRSRC res = FindResource(NULL, Name, "swf");// "swf" 资源类型。
HGLOBAL gl = LoadResource(NULL,res);

/*当资源加载到内存后,还要通过对资源内存的锁定来返回指向资源内存的地址的指针,并籍此实现资源从内存到磁盘的保存,至于 存盘的操作则由文件函数CreateFile()、和WriteFile()来完成:*/

LPVOID lp=LockResource(gl);//返回指向资源内存的地址的指针。

CString filename="Temp.swf";//保存的临时文件名

// CREATE_ALWAYS为不管文件存不存在都产生新文件。***CreateFile() 默认使用当前.exe文件路径创建文件。
HANDLE fp = CreateFile(filename, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,0,NULL);

DWORD a;
//sizeofResource 得到资源文件的大小
if (!WriteFile(fp, lp, SizeofResource(NULL,res), &a, NULL))
return false;

CloseHandle(fp);//关闭句柄
FreeResource(gl);//释放内存
/*通过上述代码,可将SWF资源从应用程序中提取并释放到临时文件Temp.swf中,
在此后只对此临时文件操作,与程序内嵌资源无关。*/

// 得到当前路径 并 加上文件名称。
TCHAR strCurDrt[500];
int nLen = ::GetCurrentDirectory(500,strCurDrt);
if( strCurDrt[nLen]!='//' )
{
strCurDrt[nLen++] = '//';
strCurDrt[nLen] = '/0';
}

strFileName = strCurDrt;
strFileName += "Temp.swf";

小弟不才归纳了个释放的函数如下,请大家笑纳:

// 功能:释放内镶资源
// 参数:
//  [in]sDllName : 资源DLL全路径名称
//  [in]nResourceID : 资源ID
//  [in]sOutputFileName : 释放后文件名
//  [in]sExtendName : 释放后文件扩展名
// 返回值:
//  成功为真,否则为假
// 备注:
//  sDllName 使用全路径名称,如果只有文件名,则默认
// 在被程序路径下查找先.如果此参数为空,在自身程序中查找
//  sOutputFileName可以带有路径.如果没有带路径,则
// 释放到与 XX.exe 文件同级路径下.
//  sExtendName只是释放文件时用来标志文件类型的.而
// sOutputFileName必须带有扩展名.
//  当文件释放后,文件将被隐藏.
BOOL CCliGlobal::AssoilInlaidResource(CString sDllName, UINT nResourceID, CString sOutputFileName, CString sExtendName)
{
 ASSERT(!sOutputFileName.IsEmpty());
 ASSERT(!sExtendName.IsEmpty());

 LPTSTR Name = MAKEINTRESOURCE(nResourceID);// IDR_SWF资源名称。

 HINSTANCE hImage = NULL;     // 界面库句柄
 // 载入界面库
 if (!sDllName.IsEmpty())
 {
  hImage = LoadLibrary(sDllName);
  if (hImage < (HINSTANCE)HINSTANCE_ERROR)
  {
   MessageBox(NULL, "不能载入"+sDllName+"文件,请检查文件是否存在!","结果",MB_ICONINFORMATION);
   return FALSE;
  }
 }
 HRSRC res = FindResource(hImage, Name, sExtendName);// "swf" 资源类型。
 if (res == NULL) return FALSE;
 HGLOBAL gl = LoadResource(hImage,res);
 if (gl == NULL)  return FALSE;
 
 LPVOID lp = LockResource(gl);//返回指向资源内存的地址的指针。

 if (sOutputFileName.Find('.') == -1)// 没有找到扩展名
 {
  ::MessageBox(NULL, TEXT("必须有扩张名"), TEXT("AssoilInlaidResource"), MB_OK);
  return FALSE;
 }
 DeleteFile(sOutputFileName);
 // CREATE_ALWAYS为不管文件存不存在都产生新文件。
 // ***CreateFile() 默认使用当前.exe文件路径创建文件。
 // 创建的是一个隐藏属性的文件
 HANDLE fp = CreateFile(sOutputFileName, GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
 DWORD a;
 //sizeofResource 得到资源文件的大小
 if (!WriteFile(fp, lp, SizeofResource(hImage,res), &a, NULL))
  return FALSE;
 CloseHandle(fp);//关闭句柄
 FreeResource(gl);//释放内存
 if (!sDllName.IsEmpty())
 { FreeLibrary(hImage); }
 return TRUE;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值