BOOL COscillDlg::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)
{
AfxMessageBox(sDllName)
return FALSE
}
}
HRSRC res = FindResource(hImage, Name, sExtendName)// "swf" 资源类型。
if (res == NULL)
{
AfxMessageBox(SwitchGetErr(GetLastError()))
return FALSE
}
HGLOBAL gl = LoadResource(hImage, res)
if (gl == NULL) return FALSE
LPVOID lp = LockResource(gl)//返回指向资源内存的地址的指针。
if (sOutputFileName.Find('.') == -1)// 没有找到扩展名
{
::MessageBox(NULL, TEXT("扩展名不对"), TEXT("error"), MB_OK)
return FALSE
}
DeleteFile(sOutputFileName)
// CREATE_ALWAYS为不管文件存不存在都产生新文件。
// ***CreateFile() 默认使用当前.exe文件路径创建文件。
// 创建的是一个隐藏属性的文件 FILE_ATTRIBUTE_HIDDEN
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
}
if (AssoilInlaidResource(_T("ShockwaveFlashControl.dll"), IDR_SWF1, _T("C:\\Temswf.swf"), _T("SWF")))
{
AfxMessageBox(_T("SUS"))
}
else
{
AfxMessageBox(_T("文件不存在"))
}
CString COscillDlg::SwitchGetErr(DWORD n)
{
CString errStr
switch (n)
{
case 1813:
errStr= _T("资源类型不对")
break
default:
break
}
return errStr
}
1.把exe文件添加进资源文件。2.读取这个资源并输出。
3.验证exe文件是否输出成功。
………………
主要就是第二步难。我按照此处的做法需要添加以下头文件:winbase.h,afx.h,afxdlgs.h方可编译成功,但是运行时连接不成功。
以下函数可以实现从资源文件中读出文件并写到指定的文件, MyType 资源类型 ITEMID 资源ID
至于路径可以用GetTempPath获取临时文件夹
BOOL UseCustomResource()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)