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

VC++ 資源檔中安全包含自訂標頭檔技巧

     編輯:關於VC++

問題現象

在 .rc 檔案中手動加入 #include "MyFile.h" 以使用第三方定義的資源 ID,但每次在 Visual Studio 資源編輯器開啟專案時,該行都會被自動刪除。

根本原因

Visual Studio 資源編輯器 (AppStudio) 在載入 .rc 時會重寫檔案,它**只保留一個** #include 陳述式 (預設為 resource.h),其餘手動添加的均會被移除。此行為在儲存時觸發,非編譯階段。

解決方案:利用 APSTUDIO_INVOKED 巨集

資源編輯器處理 .rc 時會定義 APSTUDIO_INVOKED,而資源編譯器 (RC.exe) **不會** 定義。利用此差異:

#ifndef APSTUDIO_INVOKED
#include "MyOtherHeader.h"
#endif
  • 資源編輯器讀取時:APSTUDIO_INVOKED 已定義 → 忽略該區塊 → **不刪除** 程式碼 (識別為非編輯器管理區塊)。
  • 資源編譯器編譯時:APSTUDIO_INVOKED 未定義 → 正常展開 #include → 第三方 ID 可用。

同理可證:GUIDELINES 區塊

資源編輯器將對話框邊界資訊存放於特殊區塊:

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
    IDD_MYDIALOG, DIALOG
    BEGIN
        LEFTMARGIN, 8
        RIGHTMARGIN, 502
        TOPMARGIN, 8
        BOTTOMMARGIN, 273
    END
END
#endif // APSTUDIO_INVOKED

此區塊僅供資源編輯器讀寫,RC 編譯器完全忽略 (不認識 GUIDELINES 關鍵字)。

操作步驟總結

  1. 開啟專案 .rc 檔 (用文字編輯器,非 VS 內建編輯器)。
  2. 在適當位置插入上述 #ifndef APSTUDIO_INVOKED 區塊。
  3. 儲存,回到 VS 繼續編輯資源,自訂標頭檔將不再消失。

補充說明

  • 此技巧適用於 VC6.0 至 VS2022 所有版本。
  • 若需變更預設 resource.h 檔名,可在方案總管右鍵專案 → Resource Includes 修改「Symbol header file」。
  • 切勿在 #ifndef APSTUDIO_INVOKED 區塊外手寫任何資源編譯器指令,否則仍會被清除。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved