Cannot load package 'B'. It contains ...的問題。 |
尚未結案
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
各位前輩大家好:
我以Delphi建立了一支呼叫C#寫的WebService的Unit(暫名為X), 因我們的程式都是使用bpl來run,所以我在A.bpl uses X unit時沒問題。 當第2支程式B.bpl也uses到X unit時,compile當下沒問題, 執行時就會出現錯誤訊息: Cannot load package 'B'. It contains unit 'X' which is also contained in package 'A'. 我找了一些網路資料,但大多數的問題都是一般的exe中use unit,但我的unit是呼叫Webservice的code, 我不太清楚要怎麼另外獨立出一個bpl來使用。 因為該unit的最後端是initialization InvRegistry.RegisterInterface(TypeInf...... end. 所以不知道要怎麼弄, 請問這該如何處理呢??? ps: 我目前的X unit是放在固定路徑,然後在Libary path中增加該路徑,以便uses。 編輯記錄
老大仔 重新編輯於 2016-06-25 08:52:58, 註解 無‧
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
謝謝sryang大的回覆。
可是我的unit是webservice, 程式碼最後一段是 [code delphi] initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com/%operationName%'); end. [/code] 這個我不清楚要怎麼包成bpl >"< ===================引 用 sryang 文 章=================== X unit 不能被多個 BPL "contains" 你應該把 X unit 獨立成一個 BPL,然後讓 A、B 兩個 BPL 來 "requires" |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
使用 loadpackage 就可會run那段code。
http://stackoverflow.com/questions/4618650/delphi-unit-initialization-not-always-called 不知道這個是不是你的相關問題與答案? ===================引 用 老大仔 文 章=================== 謝謝sryang大的回覆。 可是我的unit是webservice, 程式碼最後一段是 [code delphi] initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com/%operationName%'); end. [/code] 這個我不清楚要怎麼包成bpl >"< ===================引 用 sryang 文 章=================== X unit 不能被多個 BPL "contains" 你應該把 X unit 獨立成一個 BPL,然後讓 A、B 兩個 BPL 來 "requires"
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
equirerequire,不需要去設甚麼Libary path
===================引 用 老大仔 文 章=================== 謝謝sryang大的回覆。 可是我的unit是webservice, 程式碼最後一段是 [code delphi] initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com/%operationName%'); end. [/code] 這個我不清楚要怎麼包成bpl >"< ===================引 用 sryang 文 章=================== X unit 不能被多個 BPL "contains" 你應該把 X unit 獨立成一個 BPL,然後讓 A、B 兩個 BPL 來 "requires" |
leveon
資深會員 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
原因就如同sryang 講的 只要將X.pas 包進(Contains)一個 c.bpl,產生C.bpl和C.dcp
然後 A.bpl B.bpl Require C.dcp即可 也就是說,你應該把所有共用的pas檔全包在一個C.bpl,給所有的bpl require,不需要去設甚麼Libary path 這也是BPL支援全域變數,和DLL間最大差異 但你的回應也很奇怪,既然你會包A.bpl 和B.bpl 為何"不清楚"怎麼包C.bpl ? 不就是new一個package 然後將x.pas add進來? 包bpl和你程式碼initialization做了甚麼又有甚麼關係? ----------------------------------------------------------------------------------------------------- 沒注意看到2F的聯結 就如同5F說的 只要LoadPackage 就會把該Bpl的所有PAS檔的initialization 區塊全部執行一遍 只會執行一次 所以重複LoadPackage 也沒有關係 ===================引 用 老大仔 文 章=================== 謝謝sryang大的回覆。 可是我的unit是webservice, 程式碼最後一段是 [code delphi] initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.xxxx.com/%operationName%'); end. [/code] 這個我不清楚要怎麼包成bpl >"< ===================引 用 sryang 文 章=================== X unit 不能被多個 BPL "contains" 你應該把 X unit 獨立成一個 BPL,然後讓 A、B 兩個 BPL 來 "requires" |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
回aftcast大大,應該算是,但,有點看不太懂他的解法>"<
我的webservice程式大概長這樣(內容的網址有替換掉) [code delphi] unit TransferFormWS; interface uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns; type TransferFormWSSoap = interface(IInvokable) ['{FFAF052D-61E3-CD7C-EB7C-D5389D1116BC}'] function SendForm(const xmlFormInfo: WideString): WideString; stdcall; function GetFormList: WideString; stdcall; function GetExternalFormList: WideString; stdcall; function GetFormStructure(const formVersionId: WideString): WideString; stdcall; function GetFormStructureByFormId(const formId: WideString): WideString; stdcall; function GetTaskData(const taskId: WideString): WideString; stdcall; function SetRelayFormData(const relayFormData: WideString): WideString; stdcall; function TerminateTask(const taskId: WideString; const account: WideString; const result: WideString; const reason: WideString): WideString; stdcall; function GetTaskResult(const taskId: WideString; const isContainFormData: WideString): WideString; stdcall; end; function GetTransferFormWSSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): TransferFormWSSoap; implementation function GetTransferFormWSSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): TransferFormWSSoap; const defWSDL = 'http://eip.XXX/WebService/TransferFormWS.asmx?wsdl'; defURL = 'http://eip.XXX/WebService/TransferFormWS.asmx'; defSvc = 'TransferFormWS'; defPrt = 'TransferFormWSSoap'; var RIO: THTTPRIO; begin Result := nil; if (Addr = '') then begin if UseWSDL then Addr := defWSDL else Addr := defURL; end; if HTTPRIO = nil then RIO := THTTPRIO.Create(nil) else RIO := HTTPRIO; try Result := (RIO as TransferFormWSSoap); if UseWSDL then begin RIO.WSDLLocation := Addr; RIO.Service := defSvc; RIO.Port := defPrt; end else RIO.URL := Addr; finally if (Result = nil) and (HTTPRIO = nil) then RIO.Free; end; end; initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.abc.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.abc.com/%operationName%'); end. [/code] ===================引 用 aftcast 文 章=================== 使用 loadpackage 就可會run那段code。 http://stackoverflow.com/questions/4618650/delphi-unit-initialization-not-always-called 不知道這個是不是你的相關問題與答案? |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
to sryang 大大~
這個unit程式結尾是 initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.abc.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.abc.com/%operationName%'); end. 這樣也能包進去嗎@@? ===================引 用 sryang 文 章=================== 您只要把這個 unit 包成一個 package,然後其他 package "requires" 這個 package,而且其他 unit "uses" 這個 unit 那麼這個 unit 內的 initialization 區段就會被執行到 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
當然可以,我的前公司這樣用已經 10 幾年了
===================引 用 老大仔 文 章=================== to sryang 大大~ 這個unit程式結尾是 initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.abc.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.abc.com/%operationName%'); end. 這樣也能包進去嗎@@? ===================引 用 sryang 文 章=================== 您只要把這個 unit 包成一個 package,然後其他 package "requires" 這個 package,而且其他 unit "uses" 這個 unit 那麼這個 unit 內的 initialization 區段就會被執行到
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
to sryang大大:
不知是否可以請您說明一下要如何包進去嗎@@? ===================引 用 sryang 文 章=================== 當然可以,我的前公司這樣用已經 10 幾年了 ===================引 用 老大仔 文 章=================== to sryang 大大~ 這個unit程式結尾是 initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.abc.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.abc.com/%operationName%'); end. 這樣也能包進去嗎@@? ===================引 用 sryang 文 章=================== 您只要把這個 unit 包成一個 package,然後其他 package "requires" 這個 package,而且其他 unit "uses" 這個 unit 那麼這個 unit 內的 initialization 區段就會被執行到 |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
不管有沒有 initialization 區段,加入 package 的方法都一樣
新增一個 package File -> New -> Package 加入 unit 在 "Contains" 處按滑鼠右鍵,Add 你的 unit 調整輸出目錄 Options -> Directories 修改 (Package) Output Directory 與 DCP Output Directory 成你想要的目錄 存檔,編譯,完成 ===================引 用 老大仔 文 章=================== to sryang大大: 不知是否可以請您說明一下要如何包進去嗎@@? ===================引 用 sryang 文 章=================== 當然可以,我的前公司這樣用已經 10 幾年了 ===================引 用 老大仔 文 章=================== to sryang 大大~ 這個unit程式結尾是 initialization InvRegistry.RegisterInterface(TypeInfo(TransferFormWSSoap), 'http://www.abc.com', 'utf-8'); InvRegistry.RegisterDefaultSOAPAction(TypeInfo(TransferFormWSSoap), 'http://www.abc.com/%operationName%'); end. 這樣也能包進去嗎@@? ===================引 用 sryang 文 章=================== 您只要把這個 unit 包成一個 package,然後其他 package "requires" 這個 package,而且其他 unit "uses" 這個 unit 那麼這個 unit 內的 initialization 區段就會被執行到
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2016-06-28 21:13:49, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |