温伟的程序生活,一步一个脚印
自己会努力,做真正独一无二的温伟!无论前方有多难,我都不会放弃... 每一篇日志,都是我的积累,全是我的原创!

::MessageBoxW(NULL,L"GPool",L"GPool",MB_MODEMASK);

ICPool *pi;

HRESULT hr = ::CoCreateInstance(__uuidof(CPool),NULL,CLSCTX_INPROC_SERVER, __uuidof(ICPool), (LPVOID*)&pi);

ICalcPi * rp;

HRESULT hr = ::CoCreateInstance(__uuidof(CalcPi),NULL,CLSCTX_INPROC_SERVER,   __ uuidof(ICalcPi),(LPVOID*)&rp);

 

无法将类型为“WinComTestLib.ShowWinComClass” COM 对象强制转换为接口类型“WinComTestLib.IShowWinCom”。此操作失败的原因是对 IID “{EAD4DC8B-BE4C-4F35-A4DB-FCCF76CD6E19}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口

 

 

C:\Documents and Settings\lxr\Local Settings\Temp

#import "test.dll" no_namespace named_guids

 

{A23E8F8A-CD66-4783-9919-4F67F321CC56}   ziji.now.1

{2D43A57E-F75F-483F-82A3-70858DC1A629}   WinComTest.ShowWinCom.1

{1F8412E6-B30D-4BFD-A5DC-70F4AA27B241}    atltest.CalcPi.1

 

第一步:将组件加入到delphi(导入类型库)  
 
第二步:声明创建;  
 
第三步:使用方法或属性;

 

序列ID    类名    函数

VC++:

 

1#import "libid:2D43A57E-F75F-483F-82A3-70858DC1A629" raw_interfaces_only raw_native_types no_namespace named_guids

IshowWinCom: libid:2D43A57E-F75F-483F-82A3-70858DC1A629

ICalcPi:   libid:1F8412E6-B30D-4BFD-A5DC-70F4AA27B241

 

2

IShowWinCom *rp;

     HRESULT hr=::CoCreateInstance(__uuidof(ShowWinCom),NULL,CLSCTX_INPROC_SERVER,__uuidof(IShowWinCom),(LPVOID*)&rp);

     rp->CreateWnd((OLE_HANDLE)pFrame->m_hWndMDIClient);

     pFrame->ActivateFrame(1);

     //rp->Release();

 

     ICalcPi * rp0;

     HRESULT hr1=::CoCreateInstance(__uuidof(CalcPi),NULL,CLSCTX_INPROC_SERVER,__uuidof(ICalcPi),(LPVOID*)&rp0);

     rp0->put_Digits(123678);   

    

     char ss[10];

     long ll=0;   

     rp0->get_Digits(&ll); 

     ::sprintf_s(ss,7,"%ld",ll);

     ::MessageBoxA(NULL,ss,"OK",MB_MODEMASK);

     rp0->Release();

 

无论是VC还是VB 都需要知道两个条件:

一是ProgID号(VB)或是TypeLib号(vc),在COM组件里会自动生成,rgs文件中。

二是接口的名称,要到COM组件的类中查找。

 

VB:

1.项目-》属性-》引用添加

2Dim wnd As WinComTestLib.IShowWinCom

        wnd = CreateObject("WinComTest.ShowWinCom.1", "")

        wnd.CreateWnd(1)

 

PowerBuilder:

1.   This application needs a script for its open event--------在应用程序Application object 下的事件open中,执行代码:open(w_pg) (其中w_pgwindows窗口)

 

2.   Insert->control->ole…对话框中

Insert control->register new中引用*.dll文件

 

3.   主要执行代码:

 

OleObject iole_cipher // 实例变量,COM对象
//
初始化函数(自动注册、创建COM对象实例)
long ll_rc
//
作为客户端连接到COM加密组件
iole_cipher = create OleObject
ll_rc = iole_cipher.ConnectToNewObject('MyCipher.RC6Codec')

iole_cipher.nownow()

 

解释:ConnectToNewObject(库名。类名)

      nownow()COM程序中的函数

 

[强制注册:run("regsvr32 路径\xxx.dll -s")]

Dephi:

7.0

打开文件为*.dpr

1、注册:Project->Import Type Library->添加.dll->创建单元

2Unit1 中: implementation  

                 uses ComObj;

3、编写事件代码:(注意标点符号end.end;

procedure TForm1.Button1Click(Sender: TObject);

                     

                        var   temObj: OleVariant;

begin

                           temObj:= CreateOleObject('ziji.now');

                           temObj.nownow;

end;

 

end.

 

4、其他相关:

   begin

 //var

        //Msg: string;

       //Obj: TObject;

begin

          //Obj := Server.CreateObject("ziji.now"); // 建立COM/COM+

          //Test(Obj).GetMsg(Msg);   // Obj转换为Test,调用GetMsg方法;

          //Label1.Text := Msg;          

end;

end;

 

AplIFInitInstance(long   hWnd,long   bAlert,long*   pErrNoLPCTSTR   pScanPath)

在对应的delphi中参数应

produre   AplIFInitInstance(hWnd:   integer;   bAlert:   integer;   var   pErrNo:   integer;   pScanPath:   string);  

 

.NET:

 

C# WEB

 

视图---》属性页---》引用---》添加引用---选择,确定

(在COM被注册后,就可以被找到。COM注册,编写后,仅编译,就可以注册。)

 

protected void Button1_Click(object sender, EventArgs e)    {

      

        zijiLib.Inow ii=new zijiLib.nowClass();

        ii.Equals("{A23E8F8A-CD66-4783-9919-4F67F321CC56}");

        ii.nownow();       

}

C# WIN

解决资源方案管理器---》引用---》添加引用---选择,确定。其他代码同上

 

 

 

先添加引用,然后在代码中using,实例化想要的类,即可使用类下面的方法

下面是一段有问题的参考代码:

Dim   Server   As   New   XXX.Server  
  Dim   myObject   As   New   XXX.Object  
  Dim   success   As   Boolean  
   
  success   =   Server.Connect("localhost",   1234)  
  success   =   Server.Login("Name",   "PWD")  
  success   =   myObject.DoSomething()  

 

 

 

 

 

 

 

 

(public:

     STDMETHOD(GPool)(void);)                        //Cpool.h

STDMETHODIMP CCPool::GPool(void)                    //Cpool.cpp……atltest

{   

     DWORD ht = ::GetCurrentThreadId();

     return ht;

}

 

STDMETHODIMP CCalcPi::UseICPool(void)                  //CcalcPi.cpp……atltest

{   

     ICPool *pi;

     HRESULT hr = ::CoCreateInstance(__uuidof(CPool),NULL,CLSCTX_INPROC_SERVER,__uuidof(ICPool),(LPVOID*)& pi);

     pi->GPool();

     pi->Release();

     return S_OK;

}

 

(public: ICPool * pi;

 public:

     void UseCPool(void);          //Test.h )    

void CTest::UseCPool(void)                                       //Test.cpp ..atlclient   

{

     ICalcPi * rp;

     HRESULT hr = ::CoCreateInstance(__uuidof(CalcPi),NULL,CLSCTX_INPROC_SERVER,__uuidof(ICalcPi),(LPVOID*)&rp);

     rp->UseICPool();

     rp->Release();

}

 

(public: CatlclientDlg(CWnd* pParent = NULL); // 标准构造函数CTest ct;) //atlclientDlg.h

void CatlclientDlg::OnBnClickedButton4()                   //atlclientDlg.cppatlclient

{    ct.UseCPool();    }

 

 

 

CTest::CTest()                                          //Test.cpp

{

     HRESULT hr;  

     hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

}

 

public:

     int IGetDG(void);

     void IPoolT();

     void ThreadTest();

public:

     void GetCalc(void);

 

 

 

 

 

 

 

 

 

 

 

 

fsoA=Server.CreateObject("Scripting.FileSystemObject")

 

fsoA=Server.CreateObjectFromClsid("0D43FE01-F093-11CF-8940-00A0C90542

28")

 

 

<Html>

<Script Language="VB" Runat="Server">

Sub Page_Load(Sender As Object,e As Eventargs)

Dim Content As String

Dim objFile As Object

fsoA=Server.CreateObjectFromClsid("0D43FE01-F093-11CF-8940-00A0C90542

28")

objFile=fsoA.OpenTextFile(Server.MapPath("TextFile.txt"),1,False)

If objFile.AtEndOfStream=False Then

Content=objFile.ReadAll

Content=Replace(Content,Chr(13),"<Br>")

Response.Write(Content)

End If

End Sub

</Script>

</Html>

 

 

可以在.NET组件中调用COM组件,同时也可以在COM组件中正常的调用.NET组件。

SqlConnection conn = new SqlConnection(init);

SqlCommand cmd = conn.CreateCommand();

cmd.CommandText = sql;

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

 

 

netcom的交互在vs.net中是这样解决的:  

 1.net   client调用com组件时,可以使用tlbimp命令为com组件生成rcw,使com组件相对于.net   client来说就像一个.net组件一样调用--在你的客户端程序中,add   reference。而更简单的方法是在.net工程中直接add   com   refernce---ok,这时rcw自动生成,可以直接code了。  

tlbimp   csharpstation.dll   /out:csharp.dll  

.

.

        using   csharp;  

        using   system;  

   

        public   class   csharpapply           {  

   

                public   static   void   main()                   {  

                        our_csharp   c   =   new   our_csharp();  

                        s.show();  

                }  

          }  

   

 upon   execution,   you   can   be   able   to   see   the   message   box   from   our   vb   dll. 

 2com   client调用.net组件用tlbexpregasm生成ccw,使.net组件相对于com   client来说就像一个com组件一样调用,然后直接code.

[编译后,bin下会自动出现调用组件的dll,这是编译器为你做的;]

 

 

%%%%%%%%%#include   "***_TLB.h"  

 同是c++,有这文件可以了,delphi就要转换为  

 ***TLB.pas文件了

%%%%%%%在客户端的StdAfx.h中加入:#import   "XXX.tlb"   no_namespace   named_guids

 xxx.tlbCOM组件的类型库文件,在服务器端的项目下一定能找到。

$$$$$$$$记住,在对组件使用完后,要调用该组件的Release(),还得释放组件库的资源

 

$$$$$$$$$$$它一个组件,至少有个IClassFactory.dll实现组件时它与你要发布的组件放在同个dll中,IClassFactory::CreateInstance()用来new   你要发布的组件的实例,返回接口,  

 dll   export   函数DllGetClassObject()   new   类厂的一个实例。  

 cocreateinstnce()->cogetclassobject()->最初时要scm(com的服务)查注册表的dll, 

 载入dll,dll中的dllgetclassobject()->new类厂,返回类厂接口,由cocreateinstance()   query客户要的接口,给客户。

##############类厂的作用和它的名字一样,是专门用于创建COM对象的。一般来说,一个COM对象必有一个类厂与之对应,当然也可以用一个类厂创建几个COM对象。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Set rs = New Recordset

  rs.ActiveConnection = "Provider=Microsoft." & _

             "Jet.OLEDB.4.0;Data Source=C:Program Files" & _

             "Microsoft Visual StudioVB98Nwind.mdb;" & _

             "Persist Security Info=False"

  rs.Open "select * from customers", , adOpenKeyset, adLockOptimistic

 

rs.Close

  Set rs = Nothing

 

 

 

 

posted on 2012-06-16 17:45  winvay  阅读(552)  评论(0)    收藏  举报