為避免外部 .swf 檔案遺失導致程式異常,可將 Flash 動畫作為自訂資源內嵌至 EXE,運行時動態釋放至暫存檔,再透過 CHtmlView(IE 內核)播放。本文提供完整資源導入、釋放、播放、清理閉環代碼。
.swf 檔案。IDR_SWF1。BOOL ReleaseSwfResource(UINT nResID, LPCTSTR lpszTempPath) {
CString strType = _T("SWF");
LPCTSTR lpszName = MAKEINTRESOURCE(nResID);
HRSRC hRes = FindResource(NULL, lpszName, strType);
if (!hRes) return FALSE;
HGLOBAL hGlobal = LoadResource(NULL, hRes);
if (!hGlobal) return FALSE;
LPVOID pData = LockResource(hGlobal);
DWORD dwSize = SizeofResource(NULL, hRes);
HANDLE hFile = CreateFile(lpszTempPath, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
FreeResource(hGlobal);
return FALSE;
}
DWORD dwWritten;
BOOL bRet = WriteFile(hFile, pData, dwSize, &dwWritten, NULL);
CloseHandle(hFile);
FreeResource(hGlobal);
return bRet && dwWritten == dwSize;
}
CString GetTempSwfPath() {
TCHAR szExePath[MAX_PATH];
GetModuleFileName(NULL, szExePath, MAX_PATH);
PathRemoveFileSpec(szExePath); // 移除檔名,保留目錄
PathAppend(szExePath, _T("Temp.swf")); // 追加暫存檔名
return CString(szExePath);
}
// 視圖類初始化
void CMyView::OnInitialUpdate() {
CHtmlView::OnInitialUpdate();
CString strPath = GetTempSwfPath();
if (ReleaseSwfResource(IDR_SWF1, strPath)) {
Navigate2(strPath, NULL, NULL); // 載入本地 swf
}
}
// 程式結束清理暫存檔
void CMyView::OnDestroy() {
CHtmlView::OnDestroy();
DeleteFile(GetTempSwfPath());
}
LockResource 取得記憶體指標,SizeofResource 取得大小。CHtmlView,需目標機安裝 IE 6.0+。Navigate2 需完整絕對路徑,相對路徑會失效。此方案在 VC6/VC.NET 皆可編譯通過,適合演示版啟動畫面、產品導覽、互動教學等需內嵌豐富動畫場景。