在2000系统上运行ok,在xp上不行,在2000系统中combobox列表显示本地连接和本地连接 6,但是在xp系统中列表显示的是控制面板中的所有东西,而且编译时提示没有定义tshell。
在component-import activex中也添加microsoft shell controls and automation(1.0)了
请教各位高手,不胜感激,代码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Shell32_TLB, StdCtrls, shellapi;type
  TForm1 = class(TForm)
    Button: TButton;
    ComboBox: TComboBox;
    Button2: TButton;
    Button3: TButton;
    Button1: TButton;
    Button4: TButton;
    procedure ButtonClick(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}
function GetNetLinkList(var list:TStrings):BOOLEAN;
var
   Shell:TShell;
   ControlPanel:Folder;
   Item:FolderItem;
   i:integer;
begin
   Result:= FALSE;
   if list = nil then exit;   Shell:=TShell.Create(Application);
   if Shell = nil then  exit;   ControlPanel:=Shell.NameSpace(ssfCONTROLS);
   for i:=0 to ControlPanel.items.Count -1 do
   begin
       Item:=ControlPanel.items.Item(i);
       if (Item.Name = '网络和拨号连接') then  //如果是英文的windows则Name也需是英文的
       begin
           ControlPanel:=Folder(Item.GetFolder);
           break;
       end;
   end;   for i:=0 to ControlPanel.items.count-1 do
   begin
       Item:= ControlPanel.items.Item(i);
       List.Add(Item.Name);
   end;
   FreeAndNil(shell);
   Result:= TRUE;
end;{++ Routine Description:
   执行 本地网络链接 的菜单命令(包括禁用、启用)
Arguments:
   IN AdapterName - 网络链接名称
   IN MenuName - 菜单名称
Return value:
   BOOLEAN - 执行是否成功
--}function ExcNetLinkMenu(const AdapterName,MenuName:String):BOOLEAN;
var
   Shell:TShell;
   ControlPanel:Folder;
   Item:FolderItem;
   i,j:integer;
   Verb:FolderItemVerb;
begin
   Result:= FALSE;
   Shell:=TShell.Create(Application);
   if Shell = nil then exit;   ControlPanel:=Shell.NameSpace(ssfCONTROLS);
   for i:=0 to ControlPanel.items.Count -1 do
   begin
       Item:=ControlPanel.items.Item(i);
       if (Item.Name = '网络和拨号连接') then  //如果是英文的windows则Name也需是英文的
       begin
           ControlPanel:=Folder(Item.GetFolder);
           break;
       end;
   end;   for i:=0 to ControlPanel.items.count-1 do
   begin
       Item:=ControlPanel.items.Item(i);
       if (Item.Name = AdapterName) then  //如果是英文的windows则Name也需是英文的
       begin
           for j:=0 to Item.Verbs.Count -1 do
           begin
               Verb:=Item.Verbs.Item(j);
               if (Verb.Name = MenuName) then
               begin
                   Verb.DoIt ;
                   Result:=TRUE;
                   break;
               end;
           end;
           break;
       end;
   end;
   FreeAndNil(shell);
end;
procedure TForm1.ButtonClick(Sender: TObject);
var
 list:TStrings;
begin
   List:=TStringList.Create ;
   GetNetLinkList(List);
   ComboBox.Items:=List;
   FreeAndNil(List);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  ExcNetLinkMenu(Trim(ComboBox.Text),'启用(&A)');
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  ExcNetLinkMenu(Trim(ComboBox.Text),'禁用(&B)');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  ExcNetLinkMenu('本地连接' ,'启用(&A)');
  ExcNetLinkMenu('本地连接 6' ,'禁用(&B)');
end;procedure TForm1.Button4Click(Sender: TObject);
begin
  ExcNetLinkMenu('本地连接 6' ,'启用(&A)');
  ExcNetLinkMenu('本地连接' ,'禁用(&B)');
end;end.

解决方案 »

  1.   

     if (Item.Name = '网络连接') then  //XP名称是这样的吧
      ExcNetLinkMenu('本地连接 6' ,'启用(&A)'); 
      ExcNetLinkMenu('本地连接' ,'禁用(&B)'); 名称要完全一致的。
      

  2.   

    感谢oosmile的提醒,不但有‘网络连接’的区别,xp是‘停用’,2000是‘禁用’。另外不能成功引shell32单元是因为文件大小不一样,我的xp机器70多k,2000的机器98k,考过来重新编译就ok了,靠还有这毛病,日的。
      

  3.   

    我只是遇到xp和xp也有的是不一样的。