全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:890
推到 Plurk!
推到 Facebook!

Cannot load package 'B'. It contains ...的問題。

尚未結案
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-06-23 13:50:29 IP:210.61.xxx.xxx 未訂閱
各位前輩大家好:
我以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, 註解 無‧
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-06-25 10:31:43 IP:210.61.xxx.xxx 未訂閱
網路資訊不多
有找到以下的文章,但沒有下文就是了...

http://www.delphigroups.info/2/31/554727.html
sryang
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2016-06-25 12:52:48 IP:59.127.xxx.xxx 訂閱
X unit 不能被多個 BPL "contains"
你應該把 X unit 獨立成一個 BPL,然後讓 A、B 兩個 BPL 來 "requires"
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2016-06-26 02:44:24 IP:42.77.xxx.xxx 未訂閱
謝謝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"
編輯記錄
老大仔 重新編輯於 2016-06-27 07:40:53, 註解 無‧
老大仔 重新編輯於 2016-06-27 07:41:14, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2016-06-27 08:59:18 IP:59.125.xxx.xxx 訂閱
使用 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
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2016-06-27 15:54:42 IP:1.163.xxx.xxx 訂閱
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 重新編輯於 2016-06-27 15:59:26, 註解 無‧
leveon 重新編輯於 2016-06-27 16:00:20, 註解 無‧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2016-06-27 15:56:09 IP:1.163.xxx.xxx 訂閱
原因就如同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"
編輯記錄
leveon 重新編輯於 2016-06-27 15:57:30, 註解 無‧
leveon 重新編輯於 2016-06-27 15:58:04, 註解 無‧
leveon 重新編輯於 2016-06-28 10:42:07, 註解 無‧
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2016-06-28 14:17:49 IP:210.61.xxx.xxx 未訂閱
回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

不知道這個是不是你的相關問題與答案?


編輯記錄
老大仔 重新編輯於 2016-06-28 14:20:49, 註解 無‧
老大仔 重新編輯於 2016-06-28 14:22:16, 註解 無‧
老大仔 重新編輯於 2016-06-28 14:23:12, 註解 無‧
sryang
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2016-06-28 14:24:51 IP:59.127.xxx.xxx 訂閱
您只要把這個 unit 包成一個 package,然後其他 package "requires" 這個 package,而且其他 unit "uses" 這個 unit
那麼這個 unit 內的 initialization 區段就會被執行到
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2016-06-28 14:42:51 IP:210.61.xxx.xxx 未訂閱
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
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#11 引用回覆 回覆 發表時間:2016-06-28 14:55:17 IP:59.127.xxx.xxx 訂閱
當然可以,我的前公司這樣用已經 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/
老大仔
尊榮會員


發表:77
回覆:835
積分:1082
註冊:2006-07-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2016-06-28 17:19:57 IP:210.61.xxx.xxx 未訂閱
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
尊榮會員


發表:38
回覆:742
積分:876
註冊:2002-06-27

發送簡訊給我
#13 引用回覆 回覆 發表時間:2016-06-28 21:13:08 IP:59.127.xxx.xxx 訂閱
不管有沒有 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, 註解 無‧
系統時間:2017-11-19 22:18:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!