none
API物件, 並未將物件參考設定為物件的執行個體 RRS feed

  • 問題

  • public class API_pfcf : MerchantBase
    {

        private static PFCFAPI.PFCFAPI ddscAPI = new PFCFAPI.PFCFAPI();

         //略

        public override string NewOrder(string user, string future, bool buy, Decimal price, int qty, bool limit)
            {
                DTrade.OrderObject order = new DTrade.OrderObject();
                order.ACTNO = user;
                order.PRODUCTID = future;
                order.BS = buy ? "Buy" : "Sell";
                if (limit)
                    order.PRICE = price;
                order.ORDERQTY = qty;
                order.TIMEINFORCE = limit ? "ROD" : "FOK";
                order.OPENCLOSE = DTrade.OpenCloseEnum.AUTO;
                order.DTRADE = DTrade.DayTradeEnum.N;
                order.ORDERTYPE = limit ? "Limit" : "Market";
                order.NOTE = "River";
                DTrade.ORDERRESULT result = ddscAPI.DTradeLib.Order(order);  <=== 出錯的地方
                return result.ERRORMSG.ToString();
            }

    }

    這個類別引用了一個外部券商的DLL(X86), 它有很多函式, 包含登入, 登出, 查詢..

    所有的功能都可以正常執行! 除了下單這個函式(如上)! 

    我上一次發生"並未將物件參考設定為物件的執行個體"時, 找了好久! 終於發現, 我的程式平台在X64, 而引用的DLL是X86的, 所以, 造成了個這個錯誤!

    之後我又修改了一些東西! 

    它有再度發生了! 但..這次, 我的編譯平台還是X86.....並沒改變!

    我修改了

    1. 增加一個抽像類別 MerchantBase, 並繼氶它!  (讓其每一個子類別, 有相同的函數)

    2. 在 Form 中(如下), 讓我可以調用不同的類別

       List<MerchantBase> MerchantList = new List<MerchantBase>() { new API_pfcf(), new API_kgi() };
       MerchantBase api;

       api =MerchantList[0]; 或 api =MerchantList[1];

    3. 還有一些細節, 應該和它無關! (我認為)

    我的思考...

    出現這個問題, 表示這個函式 ddscAPI.DTradeLib.Order(order); 在執行上出現未初始化的問題! 但其它物件的函式又可以正常運行! 所 ddscAPI 這個物件顯然是存在, 而且正常的! 而ddscAPI.DTradeLib 也是正常的!為何單一函式出現問題?

    是因為抽像類別的關係嗎? 


    • 已編輯 GaryChiang 2019年10月14日 上午 04:43
    2019年10月14日 上午 04:16

解答

  • 一般两种情况。

    1. 没有设定为32位运行。

    2. 你调用的dll需要注册。

    你可以从群益金融网上下载FSCAPIATL2.cab文件(https://www.capital.com.tw/CA/FSCAPIATL2.cab)。解压后会有两个文件,FSCAPIATL2.dll和FSCAPIATL2.inf,其中inf文件就是用于注册的。或者手动注册:

    regsvr32 c:\dll所在的位置\FSCAPIATL2.dll

    有些人的机器上可能装过ActiveX插件或其它软件,这样就已经注册过了。如果你的机器没有装过这些东西就需要自己手动注册。

    • 已標示為解答 GaryChiang 2019年10月15日 上午 12:21
    2019年10月14日 下午 03:32

所有回覆

  • 也許要看看 ddscAPI.DTradeLib.Order 方法中傳入的 order 是否有甚麼屬性是 null ,導致 ddscAPI.DTradeLib.Order 要運作的時候出現 nullreferenceexception

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年10月14日 上午 10:23
    版主
  • 謝謝版主!

    後來我在log裏找到了這個錯誤!

    20191014 18:25:04.504 -->:DTrade.Start():尚未安裝簽章元件擷取元件 (CLSID 為 {4B6C50D7-0E3F-4DB3-8998-F7AC9684C105}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))。
    20191014 18:25:04.603 -->:FTrade.Start():尚未安裝簽章元件擷取元件 (CLSID 為 {4B6C50D7-0E3F-4DB3-8998-F7AC9684C105}) 的 COM Class Factory 失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))。

    但, 這個程式, 在另一台電腦卻可以正常執行! 

    所以, 我使用的電腦有問題?

    但前幾天, 我的電腦還可以正常運作! (雖然, 這二天, 電腦的硬體出了點問題, 有個硬碟掛了! 但這應該無關吧!)


    • 已編輯 GaryChiang 2019年10月14日 上午 10:58
    2019年10月14日 上午 10:54
  • 把用到的 COM 元件重新安裝看看。

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年10月14日 上午 11:24
    版主
  • 如果你的變數是結構型別,新版的 Visual Studio 編譯器並非採用緊實傳遞,需要自行宣告位元組之間的關係。

    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年10月14日 下午 12:47
  • 謝謝板主:

    我是用券商給的 DLL, 使用其內的物件和函式! 之前也未安裝任何的COM就可以執行了! 所以, 我也不知道要安裝什麼COM!

    謝謝心冷熱情熄:

    DLL將變數封裝的很好, 我上的例子簡化了! 它的變數大多使用例舉, 所以, 要出錯還真的很難! 另外, 若是變數出了問題, 應該在另一台電腦上無法執行才對! 這點, 我就想不出來了!

    2019年10月14日 下午 12:58
  • 我講的是這玩意。

    https://docs.microsoft.com/zh-tw/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack

    結構變數在 COM/DLL 基本上是緊密排列,但在 .Net 則不是。

    由於 .Net 不是緊密排列,在結構變數傳遞時,就有可能遠程參照傳到空位置,實際參照的記憶體反而是參照 0 指標,導致因記憶體位置錯誤而發生「並未將物件參考設定為物件的執行個體」

    C# 不確定是哪版開始改回預設值而非緊密排列,說明書先改,編譯器後改的。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年10月14日 下午 03:29
  • 一般两种情况。

    1. 没有设定为32位运行。

    2. 你调用的dll需要注册。

    你可以从群益金融网上下载FSCAPIATL2.cab文件(https://www.capital.com.tw/CA/FSCAPIATL2.cab)。解压后会有两个文件,FSCAPIATL2.dll和FSCAPIATL2.inf,其中inf文件就是用于注册的。或者手动注册:

    regsvr32 c:\dll所在的位置\FSCAPIATL2.dll

    有些人的机器上可能装过ActiveX插件或其它软件,这样就已经注册过了。如果你的机器没有装过这些东西就需要自己手动注册。

    • 已標示為解答 GaryChiang 2019年10月15日 上午 12:21
    2019年10月14日 下午 03:32
  • 謝謝心冷熱情熄:

    這個感覺好大的一個坑, 不小心就會錯到自己都不知道錯在那裏!

    之前用sendmessage就撞牆撞了好幾天! 後來才在高人指點下解決了這個問題!

    (X86和X64所佔位元大小不同)

    謝謝[-] 和 板大:

    我昨天把券商的COM都重裝一次! 結果可以正常了!

    但, 我的疑問還沒解!? 為何之前, 我沒安裝券商的COM也能執行(另一台可執行的也沒有), 不知道是何時安裝的!? 再者, 過了一個周末, (我壞了一個硬碟-資料碟), 這個COM就消失了! 真的太神奇了!

    2019年10月15日 上午 12:19
  • 但, 我的疑問還沒解!? 為何之前, 我沒安裝券商的COM也能執行(另一台可執行的也沒有), 不知道是何時安裝的!? 再者, 過了一個周末, (我壞了一個硬碟-資料碟), 這個COM就消失了! 真的太神奇了!

    FSCAPIATL可能是某种资料处理程序,因此可能有其它程序也用这个dll。由于dll是公共的,因此只要有一个软件注册过这个dll就行了。你或别人的机器上可能在装别的软件时注册过,因此之前是没有问题的。另外你之前注册的dll可能位于你出故障的硬碟上,因此换了硬件后就没了。当然具体是怎么回事别人也无法仅通过论坛来判别,总之肯定是缺少注册这个原因导致的。
    2019年10月15日 上午 06:41