::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.项目-》属性-》引用添加
2.Dim 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_pg是windows窗口)
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->创建单元
2、Unit1 中: 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* pErrNo,LPCTSTR 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.cpp…atlclient
{ 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();
net和com的交互在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.
2。com client调用.net组件用tlbexp或regasm生成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.tlb为COM组件的类型库文件,在服务器端的项目下一定能找到。
$$$$$$$$记住,在对组件使用完后,要调用该组件的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
浙公网安备 33010602011771号