首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 內嵌資源動態釋放播放 Flash 動畫:SWF 內嵌與 CHtmlView 完整方案

     編輯:VC 教學

為避免外部 .swf 檔案遺失導致程式異常,可將 Flash 動畫作為自訂資源內嵌至 EXE,運行時動態釋放至暫存檔,再透過 CHtmlView(IE 內核)播放。本文提供完整資源導入、釋放、播放、清理閉環代碼。

資源導入步驟

  1. 資源視圖 → 右鍵 Import → 選擇 .swf 檔案。
  2. 資源類型輸入 "SWF"(含引號),資源 ID 如 IDR_SWF1。
  3. 資源以二進制形式存入 EXE,資源視圖不可再編輯。

動態釋放核心代碼

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);
}

CHtmlView 播放與清理

// 視圖類初始化
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());
}

關鍵技術點總結

  • 資源類型:自訂 "SWF",區分標準資源(BITMAP, ICON 等)。
  • 鎖定資源:LockResource 取得記憶體指標,SizeofResource 取得大小。
  • CHtmlView 前提:專案建立時視圖類選 CHtmlView,需目標機安裝 IE 6.0+。
  • 路徑處理:Navigate2 需完整絕對路徑,相對路徑會失效。
  • 擴展性:同樣手法可內嵌 DLL、HTML、XML 等任意二進制模組,運行時釋放使用,實現「單一 EXE 部署」。

此方案在 VC6/VC.NET 皆可編譯通過,適合演示版啟動畫面、產品導覽、互動教學等需內嵌豐富動畫場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved