奇怪的问题---我在win2000下编的程序在别的机器上(win98)运行不了!提示“类没有注册”,我的程序用到了LMD5.0控件和Windows里的Agent

  • 主题发起人 主题发起人 Cbfan
  • 开始时间 开始时间
C

Cbfan

Unregistered / Unconfirmed
GUEST, unregistred user!
奇怪的问题---我在win2000下编的程序在别的机器上(win98)运行不了!提示“类没有注册”,我的程序用到了LMD5.0控件和Windows里的Agent控件?是不是哪个控件没有注册?怎么解决呢?(100分)<br />奇怪的问题---我在win2000下编的程序在别的机器上(win98)运行不了!提示“类没有注册”,我的程序用到了LMD5.0控件和Windows里的Agent控件?是不是哪个控件没有注册?怎么解决呢?怎样用 REGSVR32 注册控件?是不是在我的机器上注册后,其它机器也可以不用注册就可以使用了?谢谢! [:(][:(][red][/red]
 
可能wing98上没有装MS Agent,
需要到microsoft网站上下载Agent的安装程序
 
REGSVR32 xxx.xxx(需要注册的文件全名,包括path);
例如:REGSVR32 c:/windows/system/mscomm32.ocx
[:)]
 
在win98下装office
 
一般来说是agent没有注册
 
谢谢!我用的是BCB,请参考:

回复人: Cbfan(☆★☆) (2001-10-19 9:40:50) 得0分
怎样用 REGSVR32 注册控件?是不是在我的机器上注册后,其它机器也可以不用注册就可以使用了?谢谢!
回复人: CyberUFO(笨鸟后飞) (2001-10-19 10:08:20) 得0分
原因:Agent需要注册!

//怎样用 REGSVR32 注册控件?

注册控件可用:
AnsiString aa;
aa=ExtractFilePath(ParamStr(0));
aa=" /s "+aa+"控件文件名";
char* bb=aa.c_str();
ShellExecute(Application->Handle,"open","regsvr32.exe",bb, NULL,SW_HIDE);

//是不是在我的机器上注册后,其它机器也可以不用注册就可以使用了?

No,需要在要运行程序的机器上本地注册。

回复人: Cbfan(☆★☆) (2001-10-19 11:03:39) 得0分
谢谢:CyberUFO(笨鸟后飞) !!!!

请问我可不可以把以上代码写在FormCreate()里,这样不就可以在“运行程序的机器上本地注册”了吗?
 
不行,运行程序的机器上还必须有Agent ActiveX控件才行,如果没有这些控件,
即使注册了也没不能运行,这些程序应该随你的程序打包分发,
 
我不知道BCB与Delphi在调用控件方面有什么区别,
但我在Delphi中是利用了[purple]Tom Lee[/purple]先生1997年写的一个控件来实现了Ocx的注册的,
我的感觉是这个控件相当好,甚至连M$的Mscomm(是需要一个Licence的控件)都注册上了
下面是[blue]该控件的原玛[/blue],看看是不是对你有帮助吧!
[:)][:D][8D][:(][:(!][^][?][?][^][:(!][:(][8D][:D][:)]
[green]
unit ActXInst;

// Auto ActiveX Controls Register/Unregsiter Component
// ver 1.03
// Last Modify 1997 JUN 28
// By Tom Lee (tom@libra.aaa.hinet.net)
// http://www.aaa.hinet.net/delphi ( Chinese BIG-5 Encoding Page )
// for Delphi 3

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, MyRegistry , ComObj, ActiveX

type
TOCXDirType=(dtSystem,dtWindows,dtApplication);

TActiveXInstaller = class(TComponent)
private
{ Private declarations }
FActive:Boolean;
FAllOcxCLSID:TStrings;
FAllOcxName:TStrings;
FAllOcxPath:TStrings;
FAutoRegList:TStrings;
FOCXDir:TOCXDirType;
function InstallOcx(const sFileName: AnsiString;bSetup: boolean): boolean;
procedure AutoRegOCX;
procedure ClearRegInfo;
procedure Dumb(value:TStrings);
procedure GetRegInfo;
procedure SetActive(value:Boolean);
procedure SetAutoRegList(value:TStrings);
procedure SetOCXDir(value:TOCXDirType);
protected
{ Protected declarations }
procedure Loaded;override;
public
{ Public declarations }
constructor Create(AOwner: TComponent)
override;
destructor Destroy
override;
procedure Refresh;
function OCXListUnregister(id:integer):Boolean;
function OCXFileRegister(FullPathFileName:String):Boolean;
function OCXFileUnRegister(FullPathFileName:String):Boolean;
function ShowRegDialog:Boolean;
function ShowUnRegDialog:Boolean;
function IsInstallOK(OCXFileName:String):Boolean;
published
{ Published declarations }
property Active:Boolean read FActive write SetActive default True;
property AutoRegister:TStrings read FAutoRegList write SetAutoRegList;
property OCXDir:TOCXDirType read FOCXDir write SetOCXDir default dtSystem;
property OCXCLSID:TStrings read FAllOcxCLSID write Dumb;
property OCXName:TStrings read FAllOcxName write Dumb;
property OCXFullPathName:TStrings read FAllOcxPath write Dumb;
end;

procedure Register;

implementation

constructor TActiveXInstaller.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FAllOcxCLSID:=TStringList.Create;
FAllOcxName:=TStringList.Create;
FAllOcxPath:=TStringList.Create;
FAutoRegList:=TStringList.Create;
FActive:=True;
FOCXDir:=dtSystem;
GetRegInfo;
end;

procedure TActiveXInstaller.Loaded;
begin
inherited;

if FActive then
begin
GetRegInfo;
AutoRegOCX;
end
else
ClearRegInfo;
end;

destructor TActiveXInstaller.Destroy;
begin
FAllOcxCLSID.Free;
FAllOcxName.Free;
FAllOcxPath.Free;
FAutoRegList.Free;
inherited Destroy;
end;

procedure TActiveXInstaller.Refresh;
begin
if FActive then GetRegInfo;
end;

procedure TActiveXInstaller.SetAutoRegList(value:TStrings);
begin
FAutoRegList.Clear;
FAutoRegList.Assign(value);
end;

procedure TActiveXInstaller.SetOCXDir(value:TOCXDirType);
begin
if value<>FOCXDir then FOCXDir:=value;
end;

function TActiveXInstaller.OCXListUnregister(id:integer):Boolean;
begin
if (FActive) and (id>=0) and (id<FAllOCXPath.Count) then
Result:=InstallOcx(FAllOCXPath[id],False)
else
Result:=False;
end;

function TActiveXInstaller.OCXFileUnRegister(FullPathFileName:String):Boolean;
begin
Result:=InstallOcx(FullPathFileName,False);
end;

function TActiveXInstaller.OCXFileRegister(FullPathFileName:String):Boolean;
begin
Result:=InstallOcx(FullPathFileName,True);
end;

function TActiveXInstaller.ShowRegDialog:Boolean;
begin
with TOpenDialog.Create(Self) do
begin
Title:='请选择需要注册的ActiveX控件';
Filter:='OCX 郎 (*.OCX)|*.OCX|DLL文件(*.DLL)|*.DLL|全部文件(*.*)|*.*';
if Execute then
Result:=InstallOcx(FileName,True)
else
Result:=False;
Free;
end;
end;

function TActiveXInstaller.ShowUnRegDialog:Boolean;
begin
with TOpenDialog.Create(Self) do
begin
Title:='请选择需要销册的ActiveX控件';
Filter:='OCX 郎 (*.OCX)|*.OCX|DLL文件(*.DLL)|*.DLL|全部文件(*.*)|*.*';
if Execute then
Result:=InstallOcx(FileName,False)
else
Result:=False;
Free;
end;
end;

procedure TActiveXInstaller.SetActive(value:Boolean);
begin
if Value<>FActive then
begin
FActive:=value;
if FActive then
begin
GetRegInfo;
AutoRegOCX;
end
else
ClearRegInfo;
end;
end;

procedure TActiveXInstaller.ClearRegInfo;
begin
FAllOcxCLSID.Clear;
FAllOcxName.Clear;
FAllOcxPath.Clear;
end;

procedure TActiveXInstaller.GetRegInfo;
var
tmpReg1,tmpReg2:TRegistry;
idx:integer;
begin
ClearRegInfo;
// Get All CLSID
tmpReg1 := TRegistry.Create;
tmpReg1.Access := KEY_READ
tmpReg1.RootKey := HKEY_CLASSES_ROOT;

if tmpReg1.OpenKey('/CLSID', False) then
begin
tmpReg1.GetKeyNames(FAllOcxCLSID);
FAllOcxName.Assign(FAllOcxCLSID);
FAllOcxPath.Assign(FAllOcxCLSID);
end;
tmpReg1.Free;

// Get All ActiveX Controls CLSID,Name,Full Path Name
for idx:=FAllOcxCLSID.Count-1 downto 0 do
begin
tmpReg1 := TRegistry.Create;
tmpReg1.Access := KEY_READ
tmpReg1.RootKey := HKEY_CLASSES_ROOT;
if not tmpReg1.KeyExists('/CLSID/'+FAllOcxCLSID[idx]+'/Control') then
begin
FAllOcxCLSID.Delete(idx);
FAllOcxName.Delete(idx);
FAllOcxPath.Delete(idx);
end
else
begin
tmpReg1.OpenKey('/CLSID/'+FAllOcxCLSID[idx],False);
FAllOcxName[idx]:=tmpReg1.ReadString('');
tmpReg2 := TRegistry.Create;
tmpReg2.Access := KEY_READ
tmpReg2.RootKey := HKEY_CLASSES_ROOT;
tmpReg2.OpenKey('/CLSID/'+FAllOcxCLSID[idx]+'/InprocServer32',False);
FAllOcxPath[idx]:=tmpReg2.ReadString('');
tmpReg2.Free;
end;
tmpReg1.Free;
end;
end;

procedure TActiveXInstaller.Dumb(value:TStrings);
begin
end;

function TActiveXInstaller.IsInstallOK(OCXFileName:String):Boolean;
var
idx:integer;
begin
for idx:=0 to FAllOcxPath.Count-1 do
begin
if UpperCase(ExtractFileName(FAllOcxPath[idx]))=UpperCase(OCXFileName) then
begin
Result:=True;
exit;
end;
end;
result:=False;
end;

procedure TActiveXInstaller.AutoRegOCX;
var
idx1,idx2,size:integer;
Buf:PChar;
Dir:string;
tmpOCXList:TStringList;
begin
Buf:=nil;

if not (csDesigning in ComponentState) then
begin
tmpOCXList:=TStringList.Create;
tmpOCXList.Assign(FAutoRegList);
for idx1:=0 to FAllOcxPath.Count-1 do
begin
for idx2:=tmpOCXList.Count-1 downto 0 do
begin
if UpperCase(ExtractFileName(FAllOcxPath[idx1]))=UpperCase(tmpOCXList[idx2]) then
tmpOCXList.Delete(idx2);
end;
end;

if tmpOCXList.Count>0 then
begin
size:=MAX_PATH;
setlength(Dir,size);
for idx1:=0 to tmpOCXList.Count-1 do
begin
case FOCXDir of
dtSystem:
begin
try
GetMem(Buf,Size);
GetSystemDirectory(Buf,size);
Dir:= StrPas(Buf);
finally
FreeMem(Buf);
end;

try
OCXFileRegister(Dir+'/'+tmpOCXList[idx1]);
except
on E:exception do
MessageDlg(tmpOCXList[idx1]+'自动注册未成功('+E.Message+')',mtWarning,[mbOk],0);
end;
end;

dtWindows:
begin
try
GetMem(Buf,Size);
GetWindowsDirectory(Buf,size);
Dir:= StrPas(Buf);
finally
FreeMem(Buf);
end;

try
OCXFileRegister(Dir+'/'+tmpOCXList[idx1]);
except
on E:exception do
MessageDlg(tmpOCXList[idx1]+'自动注册未成功('+E.Message+')',mtWarning,[mbOk],0);
end;
end;

dtApplication:
begin
Dir:=ExtractFilePath(Application.EXEName);
try
OCXFileRegister(Dir+'/'+tmpOCXList[idx1]);
except
on E:exception do
MessageDlg(tmpOCXList[idx1]+'自动注册未成功('+E.Message+')',mtWarning,[mbOk],0);
end;
end;
end;
end;
GetRegInfo;
end;
tmpOCXList.Free;
end;
end;

function TActiveXInstaller.InstallOcx(const sFileName: AnsiString;bSetup: boolean): boolean;
var
hOcx: THandle;
funcRegister: TDllRegisterServer;
funcUnRegister: TDllUnRegisterServer;
begin
Result := False;
// Check File Exist ?
if not FileExists(sFileName) then
Raise EOleError.CreateFmt('%s不存在,无法载入', [sFileName]);
// Load a ActiveX File (.OCX , .DLL )
hOcx := LoadLibrary(pchar(sFileName));
if hOcx < 32 then
Raise EOleError.CreateFmt('无法载入文件,请检查%s请检查是否为.Ocx或.Dll格式', [sFileName]);
try
// uses DllRegisterServer get call address
if bSetup then
begin
funcRegister := GetProcAddress(hOcx, 'DllRegisterServer');
if @funcRegister = nil then
Raise EOleError.CreateFmt('无法载入%s中的DllRegisterServer,请确认此文件为Self-Register类型的OCX控件',[sFileName]);
// Execute DllRegisterServer
Result := funcRegister = S_OK;
end
else
begin
funcUnRegister := GetProcAddress(hOcx, 'DllUnregisterServer');
if @funcUnRegister = nil then
Raise EOleError.CreateFmt('无法载入%s中的DllUnRegisterServer,请确认此文件为Self-UnRegister类型的OCX控件',[sFileName]);
// Execute DllUnregisterServer
Result := funcUnRegister = S_OK;
end;
// Prompt Error Message
if not Result then
begin
if bSetup then
Raise EOleError.CreateFmt('无法登陆注册%s', [sFileName])
else
Raise EOleError.CreateFmt('无法取消注册%s', [sFileName]);
end;
finally
FreeLibrary(hOcx);
end;
end;

procedure Register;
begin
RegisterComponents('Win32', [TActiveXInstaller]);
end;

end.


[/green]
 
[red]ms的东东MSAgent也需要注册吗?真搞不懂???[/red][?]
 
不是没有注册,而是Windows 98根本没有自带MS Agent控件。
你可以去微软网站下载单独的MS Agent
 
98下是没有AGENT的,要装了OFFICE后才有,去MS当也可以
 
您是在Win2000编译的吗?如果是,请将源码拿到Win98上编译一次就可以了.我试也试过,后来
编译过就没事了.
 
是啊,跨平台至少也要重新编译一下呀
 
从编译一下就可以了吗??为什么不能动态注册呢?在程序的FormCreate()写上
REGSVR32 ……[blue][/blue][:D]
 
[red][/red][:(!]我已经在程序中动态注册Agent控件了,并把AGENTCTL.DLL 打包了,
但是有的Windows98就没有这样的错误了,有的仍然产生“类没有注册”的错误,
是不是操作系统的原因呢??
 
因为有的计算机(WIN98)装了msagent,你看一下,是不是正常运行的WIN98中都装了
office2000
 
代码:
现在这个问题已经有眉目了,大家清看看CSDN上的讨论(部分):

***************************************************************************************************


回复人: wilson_z(我自横刀向天笑:)) (2002-1-6 14:37:49) 得0分
我认为:
1。“如果这台98出现“类没有注册”,那在安装时注册会产生一个错误!”这说明注册不成功,
2。“如果这台98可以运行,既没有产生“类没有注册”,那在安装时注册也可以,只是提示重启动机器。”这说明该机器以前已经注册了,提示“重启动机器”是因为覆盖了以前安装的文件,所以该机器可以正常运行该程序。
综上所述,你的注册根本没有用,不知到你到底是在安装程序里注册,还是在EXE运行时注册?!
我做的程序都是在安装程序里注册。

你是否吧你所使用的所有控件都注册了?

回复人: VSaber(☆浪人☆) (2002-1-6 15:00:39) 得0分
明显的没有注册activex,LMD5.0我不知道是什么,不过你也注册一下吧!
至于agent当然是activex了,记得一定注册,通常这个是office带的东西,所以安装了office就可以用了!
回复人: coolcalf(牛犊初生[菜牛]) (2002-1-6 16:12:00) 得0分
关注关注
回复人: Cbfan(☆★☆★☆) (2002-1-16 12:37:48) 得0分
感谢各位的关注。

这个问题已经比较明朗了,我也同意wilson_z(我自横刀向天笑:)) 的意见,即:我的注册根本没有用!
事实上,我不仅在安装程序是注册过,而且也是过在exe的FormCreate()里注册过,更有在两者都注册过。
但是都没有作用。程序在Windows98运行时依然提示:“类没有注册”。我是在Windows2000编译的。
没有在Windows98下编译的条件,所以无法试着在98下编译一遍。

但是我觉得只要在安装程序注册这个dll,应该在98下可以运行的。
安装程序我用的是 Setup Generator Pro,注册agentctl.dll
不知道是什么原因导致ActiceX在98下无法注册。

还有,装了Office的98也不行。


回复人: Cbfan(☆★☆★☆) (2002-1-17 21:01:17) 得0分

安装程序我用的是 Setup Generator Pro,注册agentctl.dll
不知道是什么原因导致ActiceX在98下无法注册。


提示:
LoadLibrary (c:/.../agentctl.dll) failed.
GetLastError returns 0x00000001f

回复人: Cbfan(☆★☆★☆) (2002-1-18 10:18:21) 得0分
安装程序我用的是 Setup Generator Pro,注册agentctl.dll
不知道是什么原因导致ActiceX在98下无法注册。


提示:
LoadLibrary (c:/.../agentctl.dll) failed.
GetLastError returns 0x00000001f



回复人: kms(相信我没错) (2002-1-19 11:54:57) 得0分
根本就没注册。
回复人: fenglingdu(风陵渡) (2002-1-19 21:53:17) 得0分
关注。。。。
回复人: wenn(阿温) (2002-1-19 22:36:17) 得0分
是不是在连接时用到了BCB的一个DLL,而在98中没有安装BCB呢?

***************************************************************************************************
 
后退
顶部