群益API Python 環境檢查:GetModule 成功了,為什麼還是建不出物件?
GetModule 跑過了,沒有報錯,接著 CreateObject 卻失敗,印出一個看不懂的負數。或是同一支程式,在某個資料夾跑得起來,換個地方執行就出錯。
群益API Python 環境檢查的第一個觀念:GetModule 沒報錯,只代表檔案讀得到;要等 CreateObject 成功,才算環境真的接通。
本文是〈群益API Python 入門〉步驟 1 到 3 的展開,說明這兩個函式各檢查什麼、位元數與路徑的陷阱,最後附一支不需要帳密的環境檢查腳本。

目錄
群益API Python 環境:GetModule 和 CreateObject 各檢查什麼?
| 函式 | 做什麼 | 檢查得到 | 檢查不到 |
|---|---|---|---|
comtypes.client.GetModule(路徑) | 讀元件 DLL 的型別資訊,產生 comtypes.gen.SKCOMLib | 路徑對不對、檔案讀不讀得到 | 位元數、有沒有註冊 |
comtypes.client.CreateObject(...) | 向 Windows 要一個已註冊的元件來用 | 有沒有註冊 | — |
GetModule 讀的是型別資訊,不會向 Windows 要已註冊的元件,所以位元數不對、元件沒註冊,它都照樣成功。
我們在 2026-10-15 實測(Python 3.12 64 位元、comtypes 1.4.16,電腦上只註冊了 x64 版的 2.13.59 元件):
| 情境 | 結果 |
|---|---|
GetModule 指向 x86 版 SKCOM.dll | 成功 |
GetModule 指向 x64 版 SKCOM.dll | 成功 |
接著 CreateObject 建立 SKCenterLib | 成功(x64 版已註冊) |
GetModule 指向不存在的路徑 | 失敗:0x80029C4A「載入類型程式庫/DLL 時發生錯誤。」 |
64 位元的 Python 讀 x86 版的元件,GetModule 也是成功的。 所以 GetModule 沒報錯,不能拿來判斷位元數對了、元件註冊好了。
為什麼群益API 的位元數一定要一致?
官方元件說明文件的更版步驟寫明(節錄):「* 請留意擇一註冊x86或x64元件,避免混用x86及x64」。官方列出的錯誤範例是:
- 「安裝x86版的SKCOM.dll,卻使用Any CPU或x64平台去執行程式」
- 「安裝x64版的SKCOM.dll,卻使用x86平台執行」
官方範例講的是 C# 的建置平台。換算到 Python,「執行的平台」就是 Python 直譯器本身的位元數,這是我們的換算,不是官方原文。
微軟的說明是兩件事:
- 在 64 位元 Windows 上,64 位元程式不能載入 32 位元的 DLL,32 位元程式也不能載入 64 位元的 DLL。
- 元件的註冊資訊,32 位元與 64 位元程式各看自己那一份。
群益元件是以 DLL 形式載入到你的程式裡,所以 Python 的位元數,必須跟註冊的元件位元數一致。
先確認自己的 Python 是幾位元:
python -c "import struct,sys; print(sys.version, struct.calcsize('P')*8, 'bit')"輸出是 64 bit 就用元件包的 x64 資料夾,32 bit 就用 x86 資料夾。
位元數不一致時,會在哪一步失敗?
不是 GetModule,這點前面的實測已經確認。
依微軟文件推論,問題會出在 CreateObject:64 位元的 Python 看不到只以 32 位元註冊的元件,反之亦然;這時 CreateObject 會回「類別未登錄」這類錯誤,錯誤碼是 0x80040154。我們沒有在群益元件上重現過這個情境,這一段是推論。
要注意,下表這兩個都是 Windows 的錯誤碼,不是群益的四位數錯誤碼:
| 錯誤碼 | Windows 訊息 | 出現在哪一步 |
|---|---|---|
0x80029C4A | 載入類型程式庫/DLL 時發生錯誤。 | GetModule 找不到檔案(實測) |
0x80040154 | 類別未登錄 | CreateObject 要不到已註冊的類別 |
在 Python 裡印出來的長相不一樣:comtypes 拋出的是 OSError,印出來是 WinError -2147221164,換算成十六進位是 0x80040154。後面的訊息文字在我們的環境是亂碼,以錯誤碼為準。換算的寫法是 hex(e.winerror & 0xFFFFFFFF)。
CreateObject 回「類別未登錄」時,先比對 Python 位元數和註冊的元件位元數,再確認有沒有以系統管理員身分註冊。註冊本身失敗的排查,見〈群益API 註冊失敗怎麼處理〉;元件被系統擋下,見〈群益API 元件無法載入〉。
相對路徑為什麼換個資料夾就失效?
相對路徑是相對於你在哪裡執行 Python,不是相對於 .py 檔放在哪裡。
我們的實測:在 C:\SKCOM 底下執行 GetModule(r".\x64\SKCOM.dll") 成功;換到 C:\Users 底下執行同一行,回 0x80029C4A。
做法有兩種:
GetModule一律用絕對路徑。- 用
os.path從腳本所在的位置組出絕對路徑。
import os
BASE = os.path.dirname(os.path.abspath(__file__))
DLL_PATH = os.path.join(BASE, "x64", "SKCOM.dll")元件資料夾可以只拿 SKCOM.dll 嗎?
不行。官方的注意事項是:「SKCOM.dll COM元件與憑證元件、報價元件需放在同一資料夾內再進行2-1元件註冊。範例程式(SKCOMTester and EXCEL file )不受此限。」
容易漏掉的是:只把 SKCOM.dll 一個檔案複製到自己的專案資料夾。整個對應位元的資料夾一起放,不要挑檔。
同一台電腦註冊好幾份,生效的是哪一份?
元件註冊時,每個類別在登錄檔裡只記一個檔案路徑。所以同一位元的元件,後註冊的會覆蓋先註冊的;32 位元與 64 位元的註冊則是分開的兩份。我們沒有實測過兩份同時註冊的情況,這是從登錄檔的結構推出來的。
如果你的電腦上有好幾個專案各帶一份元件,版本不一致時,先確認現在生效的是哪一份。確認方法是呼叫 SKCenterLib_GetSKAPIVersionAndBit:官方說明是「取得目前註冊SKAPI 版本及位元。」,回傳值是「目前註冊SKAPI版本及COM位元。(EX: 2.13.30_x64)」。
我們實測在登入之前呼叫也能取得結果,參數給空字串或任意字串,都回 2.13.59_x64。官方沒有說明呼叫時機,這是我們的實測,不是官方保證。版本升級的做法,見〈群益API 版本升級要注意什麼〉。
群益API Python 環境檢查腳本
下面這支腳本不需要帳號密碼,也不會登入,照「位元數 → 載入型別 → 建立物件 → 版本與位元」的順序檢查:
# 群益API Python 環境檢查:位元數 → 載入型別 → 建立物件 → 版本與位元
# 不需要帳號密碼,不會登入
import os
import struct
import sys
import comtypes.client
DLL_PATH = r"C:\SKCOM\x64\SKCOM.dll" # 改成你註冊的元件路徑,用絕對路徑
print("Python", sys.version.split()[0], struct.calcsize("P") * 8, "bit")
if not os.path.isabs(DLL_PATH):
print("提醒:相對路徑是相對於目前工作目錄:", os.getcwd())
# 第 1 關:讀型別資訊。只檢查得到「檔案讀得到」,檢查不到位元數與註冊
comtypes.client.GetModule(DLL_PATH)
import comtypes.gen.SKCOMLib as sk
print("GetModule OK")
# 第 2 關:建立物件。成功了,環境才算真的接通
try:
center = comtypes.client.CreateObject(sk.SKCenterLib, interface=sk.ISKCenterLib)
except OSError as e:
print("CreateObject 失敗:", hex(e.winerror & 0xFFFFFFFF))
print("請比對 Python 位元數與註冊的元件位元數,並確認有以系統管理員註冊")
raise SystemExit(1)
print("CreateObject OK")
# 第 3 關:確認目前接到的元件版本與位元(我們實測登入前即可呼叫)
print("元件版本與位元:", center.SKCenterLib_GetSKAPIVersionAndBit(""))幾點說明:
GetModule刻意不包try:它失敗時會直接拋出例外結束,讓你看到原始的錯誤訊息。CreateObject失敗時印十六進位碼:comtypes 給的是十進位負數,換算後才查得到。SKCenterLib_GetSKAPIVersionAndBit(""):官方的參數說明是使用者登入帳號;這裡傳空字串,是依我們的實測:傳空字串或任意字串都回同樣結果。- 路徑
C:\SKCOM\x64\SKCOM.dll只是示範,改成你自己註冊的位置。
三關都通過,就可以回到〈群益API Python 入門〉的步驟 4,開始登入。各個物件管什麼、登入前後的初始化順序,見〈群益API 的六個 COM 物件各管什麼〉。
群益API Python 環境的 5 個誤解
- 誤解:
GetModule沒報錯,就代表環境接好了。其實: 它只讀型別資訊,位元數不對(我們實測)或沒註冊,都照樣成功,要CreateObject成功才算接通。 - 誤解: 位元數不對,會在
GetModule就失敗。其實: 我們實測 64 位元 Python 讀 x86 版元件,GetModule是成功的。 - 誤解: 相對路徑是相對於
.py檔。其實: 是相對於執行 Python 時的工作目錄。 - 誤解: 只要把
SKCOM.dll一個檔案複製到專案就好。其實: 官方要求它跟憑證元件、報價元件放在同一資料夾,再進行註冊。 - 誤解: 「類別未登錄」一定是沒註冊。其實: 依微軟文件推論,註冊了另一個位元的元件,程式一樣看不到。
常見問題
群益API Python 的 GetModule 成功了,為什麼 CreateObject 還是失敗?
GetModule 只讀型別資訊,不檢查位元數與註冊。CreateObject 失敗時,先比對 Python 位元數和註冊的元件位元數,再確認有沒有以系統管理員身分註冊。
錯誤訊息是 WinError -2147221164,是什麼意思?
換算成十六進位是 0x80040154,Windows 的訊息是「類別未登錄」,代表 CreateObject 要不到已註冊的類別。這是 Windows 的錯誤碼,不是群益的錯誤碼。
GetModule 出現「載入類型程式庫/DLL 時發生錯誤」怎麼辦?
錯誤碼是 0x80029C4A。我們實測在路徑找不到檔案時出現這個錯誤碼,先檢查路徑;如果用的是相對路徑,它是相對於你執行 Python 的位置,改用絕對路徑。
怎麼確認電腦上現在生效的是哪一版元件?
建立 SKCenterLib 物件後,呼叫 SKCenterLib_GetSKAPIVersionAndBit,回傳值會是像 2.13.59_x64 這樣的字串,包含版本與位元。我們實測登入前也能呼叫。
風險揭露
期貨與選擇權屬高槓桿商品,價格波動可能造成超過原始保證金的損失,交易人須自負交易責任。本文為程式開發技術教學,說明 Python 端連接群益API 元件的環境檢查方式,不構成投資建議,也不保證任何交易結果。程式化交易並不降低市場風險,環境設定錯誤可能讓程式在市場變化時無法正常運作,正式使用前請充分測試。
投資人教育資源
| 機構 | 資源 |
|---|---|
| 臺灣期貨交易所(TAIFEX) | 期貨及選擇權數位學習網 |
| 證券暨期貨市場發展基金會 | 證券期貨市場教育推廣 |
| 金融智慧網 | 金管會金融知識平台 |
| 中華民國期貨業商業同業公會 | 期貨業法規與宣導 |
| 證券投資人及期貨交易人保護中心 | 投資人保護與申訴 |
延伸閱讀
- 〈群益API Python 入門〉——從安裝到收到第一筆報價的 7 個步驟。
- 〈群益API 註冊失敗怎麼處理〉——註冊本身失敗的排查步驟。
- 〈群益API 元件無法載入〉——元件被系統擋下時的判別方式。
- 〈群益API 版本升級要注意什麼〉——換版步驟與 9996。
參考資料
- 位元數注意事項、元件需放在同一資料夾、
SKCenterLib_GetSKAPIVersionAndBit的說明與回傳值,依群益官方元件說明文件。 - Process Interoperability – Microsoft Learn(64 位元與 32 位元程式不能互相載入 DLL)
- Registry Keys Affected by WOW64 – Microsoft Learn(元件註冊資訊 32 位元與 64 位元分開)
- InprocServer32 – Microsoft Learn(每個類別在登錄檔裡記一個檔案路徑)
GetModule在位元數不符時照樣成功、相對路徑以工作目錄為基準、登入前可呼叫版本函式、錯誤碼在 Python 的印出形式:我們 2026-10-15 的實測,非官方文件記載。位元數不一致時CreateObject失敗,為依微軟文件的推論,未在群益元件上實測。
免責聲明
本文章僅作為群益API實作經驗分享,不構成投資建議,且策略及程式皆應自行撰寫。期貨及衍生性金融商品交易屬高風險投資,請謹慎評估自身風險承擔能力。







