C++ COM 方法簽名:HRESULT sayHello2([in] BSTR say, [out, retval] BSTR* result);
Java 端使用 Jacob 調用 Dispatch.call(disp, "sayHello2", "fuck") 拋出 Can't map name to dispid: sayHello2 或返回亂碼。
ComThread.InitSTA(); // 單線程單元模式,GUI/COM 組件常用
ActiveXComponent com = new ActiveXComponent("CLSID:FF90EFCA-0856-4159-A9CC-0E7BBC317554");
Dispatch disp = (Dispatch) com.getObject();
// 確保字符串以正確編碼傳遞(通常 Jacob 內部處理 Unicode,無需手動轉碼)
// 若遇亂碼,可嘗試顯式指定編碼構造 Variant
Variant input = new Variant("測試字符串"); // 直接傳字符串,Jacob 自動轉 BSTR
Variant result = Dispatch.call(disp, "sayHello2", input);
System.out.println(result.getString()); // 獲取返回 BSTR
ComThread.InitSTA() 而非 MTA,許多 ActiveX/COM 組件要求 STA。String 或 Variant(String),讓 Jacob 內部處理 Unicode→BSTR 轉換,避免手動 getBytes() 損壞數據。Can't map name to dispid,嘗試 disp.getIDsOfNames 確認方法名,或調用 Dispatch.callN 忽略大小寫。