各位快来吧?COM+的问题的基本问题。250分。(250分)

  • 主题发起人 主题发起人 djjsl
  • 开始时间 开始时间
D

djjsl

Unregistered / Unconfirmed
GUEST, unregistred user!
各位,在下又来了。这次在下有如下几个问题:
1、DELPHI的组件支持组件缓冲吗?
2、在COM+的缓冲池中存在同一个对象不同的对象实例吗?
3、最最重要的一个问题,COM+ SERVICES EXPLORER中的ENABLE OBJECT CONSTRUCTION
中我们定义的字符串,在组件的代码中我们怎么调用,如果大家能告诉我VB中的方式
最好,当然,D也可以。
谢谢大家为我解惑。
 
>> 1、DELPHI的组件支持组件缓冲吗?

组件缓冲 好像不是由编程语言来实现的。这是由COM的环境实现的,你把COM放在MTS中
即可实现COM pooling(当然 你的COM要符合pooling的标准),COM+ 对pooling支持的更好了,
Windows2000中就有COM pooling的环境,无需像WinNT中装MTS。
 
to lha:
组件缓冲是由语言决定的,用vb编的组件就不支持,这可由
COM+的组件服务里看出来。
to every one:
那位能帮我回答一下第三个问题。当然,前两个理论问题,
欢迎大家讨论。神啊!救救我吧!
 
>> 组件缓冲是由语言决定的,用vb编的组件就不支持,这可由COM+的组件服务里看出来。

试问: 你用其他语言(VC or Delphi)写的能实现COM pooling 的COM ,拿到win98中试一试,
看看还能不能成功?

我就不信, 不是COM的环境的支持,你的COM能pooling? 快到win98下去试一试。
不要忘了Windows2000可是集成了COM+环境的,winNT4则是需要MTS来支持COM pooling。
用vb编的组件不支持,是因为不符合这个pooling的规范。
 
这位兄台,在COM+中,组件缓冲指的是能否用OBJECT POOLING,
如果你用VB编写组件,将其放如COM+,可以看到在OBJECT POOLING
一栏是不可用的。
我想我们可能有些误会。
 
1. Object Pooling的基本要求是组件的线程模式为Free或Neutral,
并且不能有线程依赖性。现在的VB写的组件肯定不能享受Object Pooling。
Delphi写的组件如果线程模式用Free的话应该可以由Object Pooling。
2. 缓冲池中可以而且应该是同一个对象不同的对象实例。
3. 通过IObjectConstruct接口来取得,我只用VC++写COM,如果你觉得
需要的话,可以给我发Email.
 
djjsl:
昨天我给你发了多次Email都被退回来了,你的信箱有问题?
我现在把它贴在这儿.
--------------------------------------------------------------------
你想用IObjectConstruct的话,首先要有IObjectConstruct的接口定义,
通过以下方法可以得到:
在Delphi中将Win2000下的comsvcs.dll import进来,
默认的话会在Delphi的Imports目录下给你生成COMSVCSLib_TLB.pas这个文件,
里面有IObjectConstruct和IObjectConstructString接口的定义.
在你的程序里应用这个文件.
并将IObjectConstruct加入你的类中, 如:
TMyServer=class(TAutoObject, IObjectConstruct)
......
end;
然后你参照我下面的代码写IObjectConstruct的Construct方法.
这段代码通过IObjectConstruct取得ADO的Connection String,
并保存在mConnectionString这个类成员中.
我觉得开发COM组件,还是ATL最好用,而且也很简单.

STDMETHOD(Construct) (IDispatch *pCtorObj)
{
_bstr_t strDesc;
HRESULT hr;
IObjectConstructString *pStr;
BSTR strConstruct;
if (pCtorObj != NULL) {
hr=pCtorObj->QueryInterface(IID_IObjectConstructString,(void **)&pStr);
if (SUCCEEDED(hr)) {
hr=pStr->get_ConstructString(&strConstruct);
if (SUCCEEDED(hr)) {
mConnectionString=strConstruct;
SysFreeString(strConstruct);
}
pStr->Release();
}
else {
_com_error err(hr);
strDesc=err.Description();
ATLTRACE(err.ErrorMessage());
}
}
else {
hr=E_POINTER;
strDesc=L"An invalid pointer was passed to Construct";
}
if (S_OK==hr)
return hr;
else
return Error((LPOLESTR)strDesc,IID_IProduct,hr);
}
 
多人接受答案了。
 
后退
顶部