共用方式為


建立 XLL

適用於:Excel 2013 |Office 2013 |Visual Studio

如果您的 DLL 是獨立的,或只依賴其他連結庫,您必須知道如何讓 Microsoft Excel 存取其函式和命令。 如需詳細資訊,請參 閱在 Excel 中存取 DLL

不過,如果您的 DLL 需要存取 Excel 功能 (例如,若要取得單元格的內容、呼叫工作表函式,或詢問 Excel 以) 取得工作區資訊,您的程式代碼必須能夠回呼 Excel。

Excel C API 提供數個函式,可讓 DLL 回呼 Excel。 若要存取這些專案,DLL 必須在編譯時期使用 Excel 32 位連結庫 xlcall32.lib 以靜態方式連結。 靜態庫可從 Microsoft 下載,作為 Microsoft Excel 2013 XLL SDK 的一部分,其中包含此連結庫的 32 位和 64 位版本。

啟用 DLL 以回呼 Excel

若要讓 DLL 能夠存取 Excel 中的功能並取得或設定工作區資訊,它必須先取得 Excel 回呼函式 Excel4、Excel4vExcel12Excel12v 的位址。 最後兩個是在 Excel 2007 中導入,並在後續版本中提供。 若要存取所有這些專案,DLL 項目必須包含 Excel 2013 XLL SDK 中下列檔案的參考。 如果您只想要存取任何 Excel) 版本中 (的前兩個回呼,則您的專案只需要包含前兩個檔案。

Xlcall.h

Xlcall.h 檔案包含下列專案:

  • 所有回調函式的函式原型。

  • 回呼用來在 DLL/XLL 和 Excel 之間交換資料的數據結構定義,以及數據類型常數定義。

  • C API 函式的定義,以及工作表、巨集工作表函數和支援之 Excel 命令的對等專案。

  • 回調函式傳回值的定義。

您應該在存取 C API 或處理 C API 使用之資料類型的所有檔案中,直接或間接透過另一個頭檔使用此檔案的 #include 指示詞

Xlcall32.lib

Xlcall32.lib 連結庫會匯出前兩個回呼 Excel4Excel4v,以及 XlCallVer 函式。 如果項目中沒有此連結庫的參考,如果您已在程式代碼中使用上述任何回呼,連結器就無法建立 XLL。 (您可以藉由動態連結至在一般 Excel 安裝過程中複製到系統的對等 Xlcall32.dll,來取得這些函式的位址。)

Xlcall.cpp

Excel 回呼 Excel12Excel12v 不會在 Xlcall32.lib 中匯出。 這可確保您從 Excel 2007 開始建立的 XLL 專案也會與舊版 Excel 搭配使用。 Xlcall.cpp模組包含 Excel12Excel12v 函式的程式代碼,這些函式會從 Excel 2007 開始呼叫 Excel 進入點,或如果您執行舊版 Excel,則會傳回安全的錯誤值。 如果您想要建立從 Excel 2007 開始執行的 XLL,而且能夠使用處理較大網格線和較長 Unicode 字元串的新數據類型,您應該在專案中包含此模組。

注意事項

從 Excel 2010 SDK 開始,可以針對 32 位和 64 位 XLL 編譯此檔案。

將 DLL 轉換成 XLL:載入巨集管理員介面函式

XLL 是一種 DLL,可匯出由 Excel 或 Excel 載入巨集管理員呼叫的數個程式。 這些程式會在這裡簡短描述,並在 載入巨集管理員和 XLL 介面函式中詳細討論。 所有這些 DLL 回呼都是以 xlAuto 前置詞開頭。 只需要其中一個命令 xlAutoOpen。 當載入巨集啟動時會呼叫它,而且通常用來向Excel註冊 XLL 函式和命令,以及執行其他初始化工作。 後續各節會提供所有 xlAuto 函式的函式簽章和範例實作。

即使 xlAutoOpen 是唯一必要的其中一個回呼,您的載入巨集可能也需要根據其行為導出其他專案。

Excel 2007 引進新的數據類型 ,XLOPER12,以容納較大的網格線,並支援長 Unicode 字符串。 主題稍後會說明XLOPER12。 雖然 xlAuto 函式採用或傳回舊的數據類型 XLOPER,但這些函式的新版本是在使用 XLOPER12 數據類型的 Excel 2007 中引進。 除了 xlAutoFree12,您有時必須實作以避免 XLOPER12 記憶體流失,您可以安全地省略所有版本 12 xlAuto 函式,在此情況下,從 Excel 2007 開始,Excel 會呼叫 XLOPER 版本。

xlAutoOpen

每當 XLL 啟動時,Excel 都會呼叫 xlAutoOpen 函式。 如果載入巨集在上一個正常結束的Excel會話中作用中,則會在Excel會話開始時啟動。 如果載入巨集是在 Excel 工作階段期間載入,則會啟動載入巨集。 您可以在 Excel 會話期間停用和重新啟動載入巨集,並在重新啟用時呼叫函式。

您應該使用 xlAutoOpen 來註冊 XLL 函式和命令、初始化數據結構、自定義使用者介面等等。

如果您的載入巨集實作並導出 xlAutoRegister 函式或 xlAutoRegister12 函式,Excel 可能會嘗試啟動並註冊函式或命令,而不需先呼叫 xlAutoOpen 函式。 在此情況下,您應該確保載入巨集已充分初始化,讓您的函式或命令正常運作。 如果不是,您應該讓註冊函式或命令的嘗試失敗,或執行必要的初始化。

xlAutoClose

每當 XLL 停用時,Excel 就會呼叫 xlAutoClose 函式。 當 Excel 會話正常結束時,載入巨集將會停用。 如果使用者在 Excel 會話期間停用載入巨集,則會呼叫 函式。

您應該使用 xlAutoClose 來取消註冊函式和命令、釋放資源、復原自定義等等。

注意事項

取消註冊函式和命令有一個已知問題。 如需詳細資訊,請 參閱 Excel XLL 開發中的已知問題

xlAutoAdd

每當使用者使用 Add-In Manager 在 Excel 工作階段期間啟動 XLL 時,Excel 就會呼叫 xlAutoAdd 函 式。 當 Excel 啟動並載入預安裝的載入巨集時,不會呼叫此函式。

您可以使用此函式來顯示自訂對話方塊,告知使用者載入巨集已啟用、讀取或寫入登錄,或檢查授權資訊。

xlAutoRemove

每當使用者在 Excel 會話期間使用 Add-In Manager 停用 XLL 時,Excel 就會呼叫 xlAutoRemove 函式。 當 Excel 工作階段正常或異常關閉並安裝載入巨集時,不會呼叫此函式。

您可以使用此函式來顯示自定義對話方塊,告知使用者載入巨集已停用,或讀取或寫入登錄。

xlAddInManagerInfo/xlAddInManagerInfo12

當第一次在 Excel 會話中叫用載入巨集管理員時,Excel 會呼叫 xlAddInManagerInfo 函式。 如果 Excel 傳遞等於 1 的自變數,此函式通常應該會傳回字串 (載入巨集的名稱) ;否則,它應該會傳回 #VALUE!。

從 Excel 2007 開始,如果 XLL 匯出 xlAddInManagerInfo 函式,Excel 會依喜好對 xlAddInManagerInfo 函式呼叫 xlAddInManagerInfo12 函式。 xlAddInManagerInfo12 函式的運作方式應與 xlAddInManagerInfo 函式相同,以避免 XLL 行為的版本特定差異。 xlAddInManagerInfo12 函式應該會傳回XLOPER12數據類型,而 xlAddInManagerInfo 函式應該會傳回 XLOPER 數據類型。

xlAutoRegister/xlAutoRegister12

每當呼叫 XLM 函數 REGISTER 或 C API 對等的 xlfRegister 函式時,Excel 就會呼叫 xlAutoRegister 函式,且所註冊的函式缺少傳回和自變數類型。 xlAutoRegister 函式可讓 XLL 搜尋其匯出函式和命令的內部清單,以使用 自變數註冊函式,並傳回指定的類型。

從 Excel 2007 開始,如果 xlAddInRegister 函式是由 XLL 導出,Excel 會依喜好對 xlAddInRegister 函式呼叫 xlAddInRegister12 函式。

注意事項

如果 xlAddInRegister/ xlAddInRegister12 嘗試註冊函式,但未提供自變數和傳回類型,則會發生遞歸呼叫循環,最終會溢出呼叫堆棧,並導致 Excel 關閉或停止回應。

xlAutoFree/xlAutoFree12

Excel 會在 XLL 工作表函式傳回 XLOPER/ XLOPER12數據類型並設定旗標,告知 Excel 仍有需要釋放 XLL 的記憶體之後,呼叫 xlAutoFree/xlAutoFree12 函式。 這可讓 XLL 將動態配置的數位、字串和外部參考傳回至工作表,而不會遺失記憶體。 從 Excel 2007 開始,支援 XLOPER12 數據類型。 如需詳細資訊,請參閱 Excel 中的記憶體管理

注意事項

從 Excel 2007 開始,當 Excel 設定為使用多線程工作表重新計算時, xlAutoFree/ xlAutoFree12 函式會在剛用來呼叫傳回它的函式的相同線程上呼叫。 在該線程上評估任何後續的工作表單元格之前,一律會呼叫 xlAutoFree/ xlAutoFree12 。 這可簡化 XLL 中的線程安全設計。 如需詳細資訊,請 參閱 Excel 中的多線程重新計算

建立 64 位 XLL

Excel 和使用者定義函式可以在 64 位作系統上執行,以利用 32 位作系統的效能優勢。 Excel 會在包含數據類型相關信息 的XLOPER12 結構中傳遞值。 當您在 XLOPER12 結構中的值與 int 或指標等原生類型之間轉換時,請小心,以保留較大類型的值。

另請參閱

從函式精靈呼叫 XLL 函式或取代對話框

載入巨集管理員和 XLL 介面函式

開發 Excel XLL