*****我发誓我用了Coinitialize!!可是还提示我尚未调用Coinitialize!!不信看看我的代码!!******(300分)

  • 主题发起人 主题发起人 叶不归
  • 开始时间 开始时间

叶不归

Unregistered / Unconfirmed
GUEST, unregistred user!
type
Tc=class(TThread)
private
P : IDispatch;
protected
procedure Execute;override;
end;

var c: TC;

implementation

uses ActiveDs_TLB,Ole2;

{$R *.DFM}

procedure TC.Execute;
begin
Coinitialize( nil ); //这个怎么没用???????
try
P := CreateOleObject('WinNt://FLYDREAM'); //出错了!!!!
(P as IADS).Put('User','asdfg');
(P as IADS).SetInfo;
finally
CoUninitialize;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
c := Tc.Create( False );
end;
这是..见鬼了吗??
 
你的情况大概要用CoinitializeEx
 
你应检查Coinitialize返回的值,我估计是不成功所导致的。
CoInitialize calls CoInitializeEx and specifies the concurrency model
as single-thread apartment. Applications developed today should
call CoInitializeEx rather than CoInitialize.
(MSDN的原话)
 
那么请问DDK,为什么会不成功?
我该怎么做?
 
我改成if Bool(Coinitialize( nil )) then Exit;仍出错,显然Co是成功的.
 
>>CreateOleObject('WinNt://FLYDREAM');
请问你是创建什么东西呢?
用CoinitializeEx也不行吗?


 
创建的是ADIS
Coinitialize怎么写?
 
CoInitialize函数内部时这样的
{
return CoInitializeEx(null,cls_apartment);
};
第一个参数时是否为聚集的一部分
第二个参数是线程模式
你创建的东西是否和现成模式有关系,如果没有的话
CoInitialize CoInitializeEx 都是一样的
另外,这是不是你的第一个程序,如果其他的程序一直都是正常的,唯独这个有问题
那确实不容易发现错误的原因,如果是你的第一个程序,那么你先检查一下你的系统环境
dcom的配置情况等.

 
我改成了:
if Bool(Coinitialize( nil )) then form1.button1.caption := 'a';
if Bool(CoinitializeEx( nil, 0 )) then form1.button2.caption := 'b';
结果显示了'b',说明Coinitialize不行,CoinitializeEx通过初始化,可是仍然出错,
仍然显示未调用,我完了!
to expect,是第一个使用Coinitialize的程序,但是第n个应用程序了。
 
你分析以下Coinitialize返回的错误,
OleCheck(Coinitialize(nil))看报告什么错误,再决定怎么做。
 
to LLLYJ: 没有任何错误提示!也就是说没错?
 
建议你从如下方面检查:
1、'WinNt://FLYDREAM' 是否完全正确?
2、'WinNt://FLYDREAM'对应的对象是否是存在DLL中?因为CreateOleObject创建的是单一的、
进程内的对象,参考如下帮助:
“CreateOleObject is used to create an object of a specified type when the
CLSID is known, and when the object is on a local or in-proc server.”
---- 摘自 CreateOLEObhect 的帮助信息

另外建议你按如下方法试试:

P := CreateComObject(ProgIDToClassID('WinNt://FLYDREAM')) as IDispatch;
(P as IADS).Put('User','asdfg');
(P as IADS).SetInfo;

 
to LLLYJ:
设如你所说'WinNt://FLYDREAM'(FLYDREAM是计算机名)是不合法的,那么..我只是想:
仿asp 或 vb中的一段代码而已:
Set odomain = GetObject("WinNT://" + servername) //引用com对象
Set ouser = odomain.Create("user", userid) //添加用户
ouser.setinfo
以上是M$ ADSI的一个应用,在VB中用来就这么三行,就实现了..好历害的ADSI
如果把这三行换成Delphi...唉,Delphi力不从心了吧??
我看了以前的代码,有人用ADSI成功建了虚拟目录,可是建用户呢?谁做过?
谁要是能解决这个问题,300分拱手相送!
 
你能把ActiveDs_TLB文件发给我看看吗?我手里没有,也许那有些帮助。
 
end.

initialization
coinitialize(nil);
在程序末尾调用,没问题啊
 
to LLLYJ:
ActiveDS_TLB是这样来的:
菜单projects--import type library--Active DS Type library [ver..1.0]
然后create unit
 
现在我得到了ActiveDS_TLB文件!

我初步研究了一下,觉得下句有问题:
P := CreateOleObject('WinNt://FLYDREAM'); //出错了!!!!
windows系统中的应用服务名称是以点(.)分割的,// 后加机器名称可能是VB的约定,
因为我试了
CreateOleObject('WinNt‘) 告诉我“一般性拒绝访问错误”。

因此,如果访问指定机器的对象,觉得应该是CreateRemoteComObject比较好。

另外,我查看了这个文件,发现IAds以及其后继接口都没有实现的对象,因此无从得到
该接口的实现。

我在继续查看。

 
代码:
IADs    *pObject;
HRESULT hr;
hr = ADsOpenObject(L"LDAP://CN=Bob,DC=Fabrikam,DC=com",
                   "jsmith",
                   "etercespot",
                   ADS_SECURE_AUTHENTICATION, 
                   IID_IADs,
                   (void**) &pObject);

这个行么?
 
感谢各位的回答,我又发现:
用Set odomain = GetObject("WinNT://" + servername) //引用com对象
Set ouser = odomain.Create("user", userid) //添加用户
ouser.setinfo
可以增加本机的用户,[blue]要增加远程机子的用户可不可以呢??[/blue]
也就是说servername不是本地机器名。
回答这个问题就行了,可以结束问题,分分!
 
多人接受答案了。
 
后退
顶部