收录日期:2020/01/29 16:03:11 时间:2016/05/18 23:55:30 标签:VB基础类
自编Active EXE组件ServerExe.MyExe,其Instancing=MultiUse;分别在系统均为Win2000的服务器和客户机上用CreateObject("ServerExe.MyExe",服务器名称)创建,发现:
1)当服务器先运行并产生实例后,客户机运行时在服务器端不产生新的实例。
2)当先运行客户机,在服务器端产生的实例后;运行服务器,会产生另一个新的实例。
请问:
有无方法实现:不管哪一方先运行,在服务器端只产生唯一实例。
DCOM的學習和配置
概述COM:
COM的分類:以VB的來講
    Dll---進程內的COM
    Exe—進程外的COM
    Ocx—控件
一、 DCOM的應用
跨網域的分布式,負載平衡的應用,應用的擴展性及本身有應用程序就是分布式的
二、COM與DCOM的區別和聯系 
COM DCOM
運行的地點 本地执行 网络上的另一台计算机上执行
存在形式 动态连接库 执行程序
通信方式 不用RPC远程调用 使用RPC远程调用
調用方式 同一線程,调用速度快 不同線程,速度慢
安全性 安全性不高 安全全性高
复杂性 配置簡單 配置较复杂


联系:
客户程序不必知道COM的存在形式
有统一的接口调用方式
客户程序甚至不知道COM对象的位置 
三、DOCM的表現方式:LPC 和 RPC

位置的通透性
HRESULT 是DCOM的傳回值
四、COM 與注冊表的關系
服務器端與客戶端要有一個相同的CLSID,客户端不需要知道他是調用本機上還是服務器上的COM,客户端仅仅需要知道组件的CLSID和APPID裡的RemoteServerName 。
微软提供了设置DCOM的工具DCOMCNFG.EXE,用来设置远程服务器,而不用手动修改注册表,我們在下面會介紹它怎麼使用的。
五、使用 Visual Basic 建立 DCOM 主從架構應用程式例子
建立伺服器
建立新的 Visual Basic 專案。在 [新增專案] 對話方塊中,選取 [ActiveX 執行檔] ,然後按一下 [開啟舊檔] 。根據預設值隨即建立 Class1。 
1. 將下面程式碼新增至 Class1 模組中: 
2. Public Function ServerTime() As String
3.     ServerTime = Time
End Function
4. 在 [專案] 功能表上,按一下 [Project 屬性] 選項,然後選取 [一般] 標籤。 
5. 在 [專案名稱] 欄位中,輸入: DCOMDemo_Svr 。 
6. 在 [專案描述] 欄位中,輸入: DCOMDemo_Svr - Server 。核取 [執行時無使用者介面] 選項。 

注意 :如果伺服器沒有任何 UI 可以確認伺服器在執行時沒有顯示任何類型的對話方塊,就應該要核取此選項。如果在非「互動使用者」登入的情況下執行伺服器,而出現任何類型的使用者互動,伺服器可能會掛掉。 
7. 選取 [元件] 標籤,然後核取 [遠端伺服器檔案] 選項。 

注意 :核取此選項會讓 Visual Basic 編譯器產生封裝會使用此伺服器的用戶端應用程式所需的 VBR 與 TLB 檔。這些檔案包含需要加入用戶端電腦上的登錄項目。 
8. 關閉 [專案屬性] 對話方塊。 
9. 在 [檔案] 功能表上,選取 [另存新檔] ,然後將此專案新增至 c:\DCOMDemo\Server 資料夾。 
10. 在 [檔案] 功能表上,選取 [製成 DCOMDemo_Svr] ,然後編譯此伺服器。 
11. 在 [專案] 功能表上,選取 [Project 屬性] 選項,然後選取 [元件] 標籤。 
12. 在 [元件] 標籤上,選取 [版本相容元件] ,選取 [與機器碼相容] 選項,然後讓此專案和您剛才建立的伺服器執行檔 (DCOMDemo_Svr.exe) 的機器碼相容。經由選取此選項,您就是在確認如果重新編譯伺服器,所有的 GUID 都會維持相同。 
建立用戶端 

1. 在 [檔案] 功能表上,選取 [新增專案] 選項,選取 [標準執行檔] ,然後按一下 [確定] 。根據預設值隨即建立 Form1。 
2. 在 [專案] 功能表上,按一下 [Project 屬性] 選項,然後選取 [一般] 標籤。 
3. 在 [專案名稱] 欄位中,輸入: DCOMDemo_Cli 。 
4. 在 [專案描述] 欄位中,輸入: DCOMDemo_Cli Project - Client 。 
5. 在 [專案] 功能表上,選取 [設定引用項目] 。從可用的設定引用項目清單中,選取 [DCOMDemo_Svr - Server] 。 
6. 在 Form1 上放置一個指令按鈕,將此按鈕的標題改為 [Run] 。 
7. 將下面程式碼放入此按鈕的按一下 (Click) 事件中: 
8.     Dim MyObj As DCOMDemo_Svr.Class1
9.     
10.     On Error GoTo err1
11.     
12.     Set MyObj = CreateObject("DCOMDemo_Svr.Class1")
13.     MsgBox "Server Time=" & MyObj.ServerTime & "  Client Time=" & Time
14.     
15.     Exit Sub
16. err1:
17.     MsgBox "Connection failed: Error " & Err.Number & " - " & Err.Description
18. 在 [檔案] 功能表上,選取 [另存新檔] ,然後將此專案儲存到用戶端資料夾中 c:\DCOMDemo\Client。 
19. 按 F5 鍵,在 IDE 中執行用戶端,試試是否可以運作。 
20. 在 [檔案] 功能表上,選取 [製成 DCOMDemo_Cli] 以編譯此用戶端,然後關閉 Visual Basic。 
封裝伺服器 
如同平常一樣,使用「封裝暨部署精靈」來封裝要散發的伺服器。遠端用戶端可以使用 DCOM 來起始此伺服器。建立伺服器封裝時,會出現一個對話方塊,詢問您此伺服器是否要作為 Remote Automation 伺服器,以及如果是作為此用途,您是否要加入支援檔案。請按一下 [否] 按鈕,因為 DCOM 不是 Remote Automation。Remote Automation 是舊式技術,已經被 DCOM 取代。 
封裝用戶端 
考慮到伺服器和用戶端不是位於同一部電腦上,在封裝用戶端時您需要採取一些特定步驟。用戶端封裝的變更可確認只安裝了型別程式庫 (.tlb 檔),並加入一些其他的登錄項目,而不是加入伺服器執行檔,用戶端電腦上不需要有伺服器執行檔,因為它不會在那兒執行。 

請使用下面步驟來封裝用戶端: 
1. 啟動「封裝暨部署精靈」,然後選取用戶端的專案。 
2. 按一下 [封裝] 按鈕,在 [封裝類型] 對話方塊中,選取 [標準的安裝程式] ,然後按一下 [下一步] 。 
3. 在 [封裝資料夾] 對話方塊中,選取要儲存此封裝的資料夾,然後按一下 [下一步] 。在本範例中,應該是 c:\DCOMDemo\Client\Package。 

注意 :您可能會收到一個對話方塊,指出沒有關於伺服器的相依資訊。請按一下 [確定] ,因為此伺服器沒有任何相依檔案。 

現在應該已經來到 [包含的檔案] 對話方塊中。 
4. 請取消選取伺服器的執行檔,DCOMDemo_Svr.exe,因為您不要散發伺服器的執行檔,接著按一下 [加入] 按鈕。 
5. 在 [檔案類型] 下拉式方塊中選取 [遠端伺服程式檔 (*.vbr)] 。 
6. 請指向儲存伺服器專案的資料夾 (在本範例中是 c:\DCOMDemo\Server),並選取相關的 VBR 檔,DCOMDemo_Svr.VBR。按一下 [開啟舊檔] , [新增檔案] 對話方塊隨即關閉。請注意,現在加入了兩個檔案:DCOMDemo_Svr.VBR 與 DCOMDemo_Svr.TLB。按一下 [下一步] 按鈕。 

注意 :您可以在 [遠端伺服器] 對話方塊中定義執行伺服器的電腦的名稱 (網路位址)。通常會將此欄位留白,因為您可能無法事先知道伺服器會安裝在哪裡。如果將此欄位留白,安裝用戶端時就會出現提示要您輸入此資訊。在本範例中,請將此欄位留白。 
7. 按一下 [下一步] 繼續進行。您現在可以依照「封裝暨部署精靈」的標準程序來繼續進行。在本範例中,請在所有剩下的對話方塊中按一下 [下一步] 即可。 
安裝伺服器 


使用之前建立的散發程式,在想要執行伺服器的電腦上安裝伺服器。如果您想要使用開發程式用的電腦來執行伺服器,就不需要執行安裝了,因為 Visual Basic 在編譯伺服器時就已經執行註冊了。 
安裝用戶端 


使用之前建立的散發程式,在想要執行用戶端的電腦上安裝用戶端。因為此用戶端使用 DCOM 伺服器,而您在建立散發程式時沒有提供伺服器的實際位置,現在就需要提供此資訊了。當安裝程式要您輸入位置時,請輸入安裝伺服器的電腦的名稱。 
設定伺服器的安全性 
1. 运行NT服务器上的DCOMCNFG程序,进行DCOM配置。
2. 进入DCOM的应用程序页面,选择“DcomDemoSvr”。
 
3. 进入DCOM的默认属性页面,将“在这台计算机上启用分布式COM”打上勾,将默认身份级别改为“无”。
 

4. 进入DCOM的默认安全机制页面,确认默认访问权限和默认启动权限中的默认值无EveryOne,如果不去掉EveryOne,应用服务器不能正常启动。

5. 在应用程序页面双击“DcomDemoSvr”或点击“属性”,打开应用服务器DCOM属性设置。
6. 将常规页面中的身份验证级别改为“无”。
 

7. 位置页面中选上“在这台计算机上运行应用程序”。
 


8. 将安全性页面设置中,均选择“使用自定义访问权限”,编辑每一个权限,将EveryOne加入用户列表中。
9. 身份标识页面中,选择“交互式用户”。
 

10. GUEST用户不能禁用。 
設定客戶端:
  你也可以不用安裝程序來安裝客戶端,可以用服務器生成的vbr文件和CliReg32.exe來設定客戶端。
1,新增注冊表的Appid對應的CLSID來指定遠端的電腦,在每個CLSID下面新增字串上Appid的字串值。然後用DcomCnfg.exe來配置。當你配置好時,CLSID下的LocalServer32子鍵值改名為_ LocalServer32
2,也可以用CreateObject(class,RemoteServerName),建議用這種方式,因為用了這種方式可以提供負載平衡或容錯支持等強固的特色


五、跨DBMS的事務程序設計
Coordinating Transaction Manager CTM
Resource Manager RM
Participating Transaction Manager PTM

使用DTC執行一個分布式的交易時,你有兩種選擇,一:使用MTS的TM。 二、直接和DTC溝通的應用程序
六、Message Query 程序設計語言

公司的饮水机里的水? 怎么安装红帽子Linux? Lotus的首页到底是什么样的? 如何设置weblogic web server的默认页面 c++builder 中不能动态调用过程 Re:请教COM接口的传递性问题 如何使编号连续???? 如何使ToolBar1和Panel1的颜色逐渐加深? DataGrid控件有Bug!!!!!!!!! 怎样验证表达式的正确性??? 知道Pop3地址如何收取internet上的邮件?谢谢! Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)为什么会报错?! 如何使用Lib中的Resource JSP中有类似asp的response.write err.description? sqlserver的mdf文件如何导入? 请问如何将从JAVA APPLET得到的信息显示在含有该APPLET的网页的状态栏中!!在线等待!!! 出售一数据库,该数据库可根据身份证的前6位确定该身份证持有者的籍贯。可到www.china-beihai.com/sfz.bmp下载抓图,共有4000多条记录。 如何实现类似photoshop和DreamWeaver那种浮动的属性对话框? 简体中文GB2312 在哪有下载? 刚学java,上来拜师 想利用C++ BUILDER画图 大菜鸟,到处跑,.....如果使用query控件来,删除,修改当前记录,三十年孤独,你最好也进来 如何在delphi用excel编的数据库 请问各位高手一个问题! 在<深度探索C++对象模型>中,有关static class data member的问题. scjp简单问题,立即结帐!!!! 数据库的连接 困惑 类型转换问题 请教有关public/protect/private三种继承方式