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

DCOM C/S Question

答題得分者是:jieshu
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-23 01:28:06 IP:61.70.xxx.xxx 未訂閱
請問各位大大...我想利用DCOM寫兩個Automation Object...分別為Client及Server端的物件 在Server會新增一個Remote Data Module...而在裡面加了一個函數叫myFunc 在Client使用TDCOMConnection去連TDCOMConnection.Connected:=True是可以連成功的(ServerName沒錯) 但當我在Client使用TDCOMConnection.AppServer.之後..就無法列舉到myFunc... 請問我錯在哪?是因為Server端不能寫成物件...亦或是少了一些步驟呢?還請各位先進幫幫我..謝謝!! 力求神乎奇技
------
力求神乎奇技
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-23 10:41:53 IP:61.221.xxx.xxx 未訂閱
您好 參考http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41695 檢查你的myFunc是不是在Type Library加的 或參考http://delphi.ktop.com.tw/topic.php?TOPIC_ID=41853 希望有您想要的 ~~應無所住而生其心~~
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-25 23:26:02 IP:218.171.xxx.xxx 未訂閱
請將Client端程式的Delphi Project Managemet加入 Server的已建構好的?????_TLB.pas好讓Client端可Uses到. 下列為Client端程式碼  
unit ord210u1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Mask, DBCtrls, StdCtrls, DB, DBClient, MConnect,
  dbcgrids, ComCtrls, ExtCtrls, DBTables, Grids, DBGrids, SConnect,
  ordserver_TLB;
type
  Tford = class(Tform)
  dcc: TDCOMConnection;
  ......
  private
    aDisp: IorddmallDisp;  //App Server介面
  ......
procedure Tford.FormCreate(Sender: TObject);
begin
  aDisp := IorddmallDisp(IDispatch(dcc.AppServer));
end;
procedure Tford.FormCreate(Sender: TObject);
var ss: String;
begin
  ss := aDisp.myFunc('123');
end;
如此當Client端程式輸入aDisp.便可列舉出Server端所有方法
 
Delphi follower
------
Delphi
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-27 13:25:12 IP:211.22.xxx.xxx 未訂閱
感謝諸位大大的回應... ying兄....我試了您的方法...列舉方法已經可行了...但您的兩個FormCreate看不是很清楚.. 因我在Client用一個簡易的Appliction Form..在上面加一個Button1..執行如下程式碼 procedure TForm1.Button1Click(Sender: TObject); var ss:String; begin aDisp := IorddmallDisp(IDispatch(dcc.AppServer)); ss := aDisp.myFunc('123'); end; myFunc是可以列舉成功...但在執行時不論用property或是method都會有錯 ===property=== ss:=aDisp.prop; ===error=== Access violation at address xxxxx. Read of address xxxxx ===method=== ss:=aDisp.myFunc(); //物件會傳回一個test的wideString ===error=== Access violation at address xxxxx. Write of address xxxxx 而我Server端的物件是先新增一個ActiveX Library..再新增一個Remote Data Module... 不知是哪裡出了問題?感謝您的解答... 力求神乎奇技
------
力求神乎奇技
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-27 14:04:44 IP:211.22.xxx.xxx 未訂閱
不好意思..我已經解決了..問題是出在我引用的Appserver的interface不是dispinterface...總算是解決了...感謝!! 力求神乎奇技
------
力求神乎奇技
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-01-27 14:10:05 IP:61.218.xxx.xxx 未訂閱
Sorry,貼太快了  
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ord000_TLB, StdCtrls, DB, DBClient, MConnect;
type
  TForm1 = class(TForm)
    dcc: TDCOMConnection;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    aDisp: IorddmallDisp;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var str: String;
begin
  str := aDisp.get_table_value('bas_colors','colr_no','colr_name','10',False);
  showmessage(str);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  aDisp := IorddmallDisp(IDispatch(dcc.AppServer));
end;
end.
以上我試正常可RUN.
 
Delphi follower
------
Delphi
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-01-27 14:34:45 IP:211.22.xxx.xxx 未訂閱
抱歉...想再請教一個問題...不知要如何部署DCOM 1.Server端已寫成一個dll //具有一個方法叫GetComputerName 2.Client寫成一個exe //DCOMConnection的設定如下 ServerName:='coTest.Test'; ComputerName:='Nbsan'; 3.在本機電腦(nbSan)上測試.. // aDisp.GetComputerName //傳回nbSan..測試成功 4.把Client.exe複製到別台電腦(pcSan)然後執行.. //出現類別未登錄 Question:是不是每台電腦都要裝註冊Server.dll呢?但好像有不符合DCOM的精神耶...不知要如何implement...感謝賜教...謝謝!! 力求神乎奇技
------
力求神乎奇技
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-27 15:31:55 IP:61.218.xxx.xxx 未訂閱
Client端應該不用註冊,MIDAS.DLL要跟著發送到Client端 \windows\system32目錄下,DCOM.connected指向AppServer電腦IP 即可. Delphi follower
------
Delphi
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-27 15:51:16 IP:211.22.xxx.xxx 未訂閱
不行耶...我爬文找到一篇文章 http://delphi.ktop.com.tw/topic.php?topic_id=21432 跟我是一樣的問題...不知解決沒? 我也看了Server端的Type Library所需use的dll...發現有midas.dll...stdvcl40.dll...stdold2.tlb...我都把他複製到Client的system32底下..也使用了regsvr32註冊他....甚至把Server的dll拿到Client端去註冊..也把DCOM.ComputerName設成IP...結果仍是一樣的錯誤"類別未登錄" 不知是不是因為AppServer不能寫成dll丫...若把架構改成COM 不知能不能解? 力求神乎奇技
------
力求神乎奇技
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-27 17:48:37 IP:61.218.xxx.xxx 未訂閱
請問你Client端的作業系統是Win98嗎? 如果是的話請安裝DCOM的安裝程式 Delphi follower
------
Delphi
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-27 17:56:38 IP:61.218.xxx.xxx 未訂閱
參考看看 http://delphi.ktop.com.tw/forum.asp?FORUM_ID=102 Delphi follower
------
Delphi
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-27 18:21:41 IP:211.22.xxx.xxx 未訂閱
感謝ying0515兄的回應... 那些文章我已經全部看過..不過我是一個In-Process Server(即為物件DLL)..非Application From...所以也沒辦法解決說... 不才也試著自己使用MTS及COM+來建置...結果都相同...結果也都不行...而李老師的ADO/MTS/COM+那本書有提及...所以當初才想這麼建置...不過卻沒看到實作In-Process的Sample Code說... 力求神乎奇技
------
力求神乎奇技
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-01-27 18:23:05 IP:211.22.xxx.xxx 未訂閱
sorry...忘了說..我兩台電腦分別是winXP及win2003...^^ 力求神乎奇技
------
力求神乎奇技
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-01-27 19:20:47 IP:203.204.xxx.xxx 未訂閱
引言: sorry...忘了說..我兩台電腦分別是winXP及win2003...^^ 力求神乎奇技
請檢查是否為權限問題。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-01-28 10:15:05 IP:211.22.xxx.xxx 未訂閱
引言: 請檢查是否為權限問題。
jieshu版主..我已照文件設定了權限...但我想類別未登錄的錯誤訊息應該無法識別到遠端物件的ProgID...或是本機端未註冊一些物件無法取得類別所致吧.. 力求神乎奇技
------
力求神乎奇技
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-01-28 13:14:00 IP:203.204.xxx.xxx 未訂閱
引言: jieshu版主..我已照文件設定了權限...但我想類別未登錄的錯誤訊息應該無法識別到遠端物件的ProgID...或是本機端未註冊一些物件無法取得類別所致吧.. 力求神乎奇技
有道理,那寫個簡單的連線測試程式(可改屬性的,如ServerName, ComputerName)測看看,先在Server上,Client/Server同一台測試看看,沒問題再由另一台當Client連到Server試試看。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
San
一般會員


發表:11
回覆:15
積分:5
註冊:2002-06-27

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-01-28 15:46:18 IP:211.22.xxx.xxx 未訂閱
引言: 有道理,那寫個簡單的連線測試程式(可改屬性的,如ServerName, ComputerName)測看看,先在Server上,Client/Server同一台測試看看,沒問題再由另一台當Client連到Server試試看。[/green]
嗯..這我也試過了說...我那兩台電腦(XP & 2003)把C/S的程式各別在同一台腦上Run都沒問題...但只要把C/S分成兩台Run..改ComputerName...兩台C/S也互換了...結果仍相同 我試在Client(nbSan)...把DCOMConnection.ComputerName設成pcSan... 然後按ServerName的Combobox...列舉出來也僅是nbSan的ProgID說...不知這樣正不正常? 力求神乎奇技
------
力求神乎奇技
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-01-28 17:12:57 IP:203.204.xxx.xxx 未訂閱
引言: 我試在Client(nbSan)...把DCOMConnection.ComputerName設成pcSan... 然後按ServerName的Combobox...列舉出來也僅是nbSan的ProgID說...不知這樣正不正常? 力求神乎奇技
正常阿,Delphi只是幫你列出本機有註冊的程式,在同一台電腦可以,分成兩台就不行,應該就是權限的問題,兩台電腦如果登入帳號一樣的話,密碼就也要一樣,不一樣的話就要有同樣的帳號存在。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
系統時間:2024-05-07 14:53:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!