收录日期:2020/09/28 22:33:21 时间: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 程序設計語言

通过scjp的可以在那个网查到自己的资料啊? 关于VC中的ACCESS数据库 我从数据库读取了一个文件数据,请问我怎么用默认的方式打开他?并在打开后自动销毁? 郁闷 小问题:Windows 命令提示符下用什么键表示输入结束(EOF)? format()的用法 谁有zlib的库啊,我想在BCB6下用TCompressionStream. 我自己描点做了一个墙,放在有光处,其它环境中的物体的光照效果均无问题,只有它一片漆黑.(大家看看代码吧!为什么会出这种事的,有几种 请教pb和oracle连接的问题 郁闷ing!这个类怎么彻底删除掉! 有关服务器智能的问题! 英雄救眉!这条语句的的错误在哪里?在线等!谢先! 强烈要求把这个问题制顶!大家想想办法吧! 新手问题,help! 有关 C 编程 如何在程序中判断当前运行环境? 数据库搜索的问题~ sybase 中判断数据是否能被整除的函数是什么 datagrid当我编辑里面的内容的时候,编辑框就会很大,把页面都搞坏了!有办法控制他吗? 怎样使用TQurry删除旧的表根据查询创建新的表!不够再加!(在线等候) 请教有关 文件操作 关于数据库的问题!急!!! b/s下搜索返回值怎样格式化 到现在不明白的问题 请问怎么把程序中的数据输出到Word文档中? ASP的问题,期待大虾们的解答 能不能在vs.net2002里设置编译器 请问广州市内的ADSL还能用HUB共享吗? HtmlView打开指定链接失败,如何知道? 谢谢你,朋友!(闲人免进,谢谢) 怎样将多个条件连接起来提交到一个表的一个字段?