Имя: Пароль:
IT
 
Как понять, что код выполняется в 64-битной ОС? [2]
0 TormozIT
 
гуру
02.09.15
14:42
1-я попытка тут Как понять, что код выполняется в 64-битной ОС?
Там было найдено лучшее решение через WMI.Win32_OperatingSystem.OSArchitecture

мWMI =  КэшКонтекстаИис.ПолучитьСлужбуWMIИис(Компьютер);
    ИмяКласса = "Win32_OperatingSystem";
    КоллекцияОС = мWMI.InstancesOf(ИмяКласса);
    Для каждого лОС Из КоллекцияОС Цикл
        Прервать;
    КонецЦикла;
    Результат = Лев(лОС.OSArchitecture, 2) = "64";

, но сегодня программу запустили на Windows 2003 Server и там не оказалось свойства OSArchitecture.
Так что нужен другой более универсальный способ.
1 TormozIT
 
гуру
02.09.15
14:42
Вот тут человек страдал похожей проблемой http://stackoverflow.com/questions/1413409/how-to-determine-os-platform-with-wmi
2 z80a
 
02.09.15
14:43
Program Files (x86)
3 Маратыч
 
02.09.15
14:45
(0) Помнится, еще был атрибут AddressWidth, не? Класс Win32Processor также через WMI если получить.
4 TormozIT
 
гуру
02.09.15
14:45
(2) В (1) http://stackoverflow.com/a/10738301 этот вариант имеет оценку 0 =)
5 Маратыч
 
02.09.15
14:45
+(3) Хотя хз, насколько он универсальный.
6 TormozIT
 
гуру
02.09.15
14:47
(3) Процессор может быть 64, а ОС 32
7 Strogg
 
02.09.15
14:49
(2) ну тогда и sysWOW64 )))
8 Маратыч
 
02.09.15
14:49
(6) Это режим работы процессора, в 32-разрядной системе он будет в режиме 32 работать.
9 Маратыч
 
02.09.15
14:50
(8) Ну, точнее, WMI вернет 32.
10 TormozIT
 
гуру
02.09.15
14:50
(8) (9) Ошибаешься.
11 Маратыч
 
02.09.15
14:54
12 Маратыч
 
02.09.15
14:55
+(11) AddressWidth
Data type: uint16
Access type: Read-only
On a 32-bit operating system, the value is 32 and on a 64-bit operating system it is 64. This property is inherited from CIM_Processor.
13 Serginio1
 
02.09.15
14:57
Environment.Is64BitProcess
14 Маратыч
 
02.09.15
14:58
(13) А вот это точно не прокатит - текущий процесс может быть и 32-разрядным в 64-разрядной ОС.
15 Serginio1
 
02.09.15
14:59
16 Serginio1
 
02.09.15
15:00
17 Serginio1
 
02.09.15
15:02
18 Serg_1960
 
02.09.15
15:04
Хмм... а если я в 32-битной 1С сижу на 64-битной ОС? :)
19 TormozIT
 
гуру
02.09.15
15:06
(11) У меня 32битная ОС. Свойство содержит значение 64.
20 TormozIT
 
гуру
02.09.15
15:07
(16) Опять?) На 1с кода так и не показал ты
21 Serginio1
 
02.09.15
15:10
22 TormozIT
 
гуру
02.09.15
15:11
(21) Согласен, что инфа полезная, но как ее применить в 1С без создания ВК?
23 Serginio1
 
02.09.15
15:13
врап=новый COMОбъект("NetObjectToIDispatch45");
    Environment=Врап.ПолучитьТип("System.Environment");
    Сообщить("Is64BitOperatingSystem="+Environment.Is64BitOperatingSystem);
24 Serg_1960
 
02.09.15
15:13
Дяденьки, простите дилетанта, но :)

СисИнфо = Новый СистемнаяИнформация;
Сообщить(СисИнфо.ВерсияОС);
Сообщить(СисИнфо.ТипПлатформы);

? О_О
25 Serginio1
 
02.09.15
15:16
(24) и?
Is64BitOperatingSystem=Да
version 6.1 Service Pack 1 (Build 7601)
Windows x86
26 TormozIT
 
гуру
02.09.15
15:16
Маратыч, в (3) (10) (19) я был не прав про AddressWidth. Перепутал с DataWidth. Похоже этот способ подходит.
27 Aloex
 
02.09.15
15:16
(24) Это для 8.x
28 TormozIT
 
гуру
02.09.15
15:18
Победил Маратыч с ответом (3)
29 Толич
 
02.09.15
15:19
Ну варианта всего два. Или 32 или 64. Чем попытка плоха?
30 MMF
 
02.09.15
15:25
WindowsKernel := LoadLibrary('Kernel32.dll');
  if WindowsKernel <> 0 then
    IsWow64Process := GetProcAddress(WindowsKernel, 'IsWow64Process');
где   TIsWow64Process=function (processhandle: THandle; var isWow: BOOL): BOOL; stdcall;
и проверяй свой процесс
        if IsWow64Process(GetCurrentProcess,iswow64)
31 Serg_1960
 
02.09.15
15:27
(25) И всё.Я не в теме. И зачем мне знать битность ОС, если я сижу, допустим, в 32-битном процессе :(
32 TormozIT
 
гуру
02.09.15
15:30
> зачем мне знать битность ОС, если я сижу, допустим, в 32-битном процессе?

Затем, чтобы администрировать COM классы обоих разрядностей.
33 Serginio1
 
02.09.15
15:42
(32) Кстати 23 это не ВК. Обычный Ком объект который может одновременно работать как в 32 разрядном так и 64 разрядном.
Правда для  Windows 2003 Server нужно компилировать под 4.0
34 vde69
 
02.09.15
15:43
проверяй свойства PCSystemType, SystemType, ну и остальные глянь :)


    Попытка
        Локатор = Новый COMОбъект("WbemScripting.SWbemLocator");
    Исключение
        Отказ = Истина;
        Результат.Вставить("Ошибка", ОписаниеОшибки());
    КонецПопытки;
    
    Если не Отказ Тогда
        Всего = 0;
        Для Каждого ТекущийАдрес из МассивАдресов Цикл
              Всего = Всего + 1;
            
            ПолученыеПараметры = Новый Структура;    
            ПолученыеПараметры.Вставить("АдресIP", ТекущийАдрес);
            
            Попытка
                Connection = Локатор.ConnectServer(ТекущийАдрес, , Логин, Пароль);
                
                Данные = Connection.InstancesOf("Win32_NetworkAdapterConfiguration");
                Для Каждого ЭлементДанных из Данные Цикл
                    Если ТипЗнч(ЭлементДанных.IPAddress) = Тип("COMSafeArray") Тогда
                        Для Каждого сч из ЭлементДанных.IPAddress Цикл      
                            Если сч = ТекущийАдрес Тогда
                                ПолученыеПараметры.Вставить("MACAddress",     ЭлементДанных.MACAddress);
                                ПолученыеПараметры.Вставить("Caption",         ЭлементДанных.Caption);
                                ПолученыеПараметры.Вставить("Description",     ЭлементДанных.Description);
                                ПолученыеПараметры.Вставить("SettingID",     ЭлементДанных.SettingID);
                            КонецЕсли;
                        КонецЦикла;
                    КонецЕсли;
                КонецЦикла;
                
                Данные = Connection.InstancesOf("Win32_ComputerSystem");
                Для Каждого ЭлементДанных из Данные Цикл
                    ПолученыеПараметры.Вставить("PCSystemType",     ЭлементДанных.PCSystemType);
                    ПолученыеПараметры.Вставить("PCSystemType",     ЭлементДанных.PCSystemType);
                    ПолученыеПараметры.Вставить("Description",         ЭлементДанных.Description);
                    ПолученыеПараметры.Вставить("DNSHostName",         ЭлементДанных.DNSHostName);
                    ПолученыеПараметры.Вставить("Domain",             ЭлементДанных.Domain);
                    ПолученыеПараметры.Вставить("Model",             ЭлементДанных.Model);
                    ПолученыеПараметры.Вставить("NameComputer",     ЭлементДанных.Name);
                    ПолученыеПараметры.Вставить("PCSystemType",     ЭлементДанных.PCSystemType);
                    ПолученыеПараметры.Вставить("SystemType",         ЭлементДанных.SystemType);
                    ПолученыеПараметры.Вставить("TotalPhysicalMemory",     ЭлементДанных.TotalPhysicalMemory);
                    ПолученыеПараметры.Вставить("Workgroup",         ЭлементДанных.Workgroup);
                КонецЦикла;
                    
                Данные = Connection.InstancesOf("Win32_OperatingSystem");
                Для Каждого ЭлементДанных из Данные Цикл
                    ПолученыеПараметры.Вставить("Caption",             ЭлементДанных.Caption);
                    ПолученыеПараметры.Вставить("CSDVersion",         ЭлементДанных.CSDVersion);
                    ПолученыеПараметры.Вставить("CSName",             ЭлементДанных.CSName);
                    ПолученыеПараметры.Вставить("OSName",             ЭлементДанных.Name);
                    ПолученыеПараметры.Вставить("OSArchitecture",     ЭлементДанных.OSArchitecture);
                    ПолученыеПараметры.Вставить("ProductType",         ЭлементДанных.ProductType);
                    ПолученыеПараметры.Вставить("SerialNumber",     ЭлементДанных.SerialNumber);
                    ПолученыеПараметры.Вставить("Version",             ЭлементДанных.Version);
                КонецЦикла;
            Исключение
                Отказ = Истина;
                ПолученыеПараметры.Вставить("Ошибка", ОписаниеОшибки());
            КонецПопытки;
            
            ПроанализированыеIP.Добавить(ПолученыеПараметры);                        
            ДлительныеОперации.СообщитьПрогресс(Всего, ТекущийАдрес);
        КонецЦикла;
35 vde69
 
02.09.15
15:44
кстати отсутствие свойства может означать что банально прав мало....
36 Лефмихалыч
 
02.09.15
16:06
СистемнаяИнформация (SystemInfo)
ТипПлатформы (PlatformType)
Использование:

Только чтение.
Описание:

Тип: ТипПлатформы; Неопределено.
Содержит тип платформы, в рамках которой осуществляется работа.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:

В режиме веб-клиента, если тип платформы иной, чем описан в типе ТипПлатформы, то содержит Неопределено.
37 TormozIT
 
гуру
02.09.15
16:43
(33) Такого COM класса у меня нет.
38 TormozIT
 
гуру
02.09.15
16:44
(35) Нет, т.к. права админа есть.
39 TormozIT
 
гуру
02.09.15
16:45
(36) Для (0) бесполезная инфа.
40 vde69
 
02.09.15
16:48
пробовал?

                Данные = Connection.InstancesOf("Win32_ComputerSystem");
                Для Каждого ЭлементДанных из Данные Цикл
("PCSystemType",     ЭлементДанных.PCSystemType);
                    ПолученыеПараметры.Вставить("SystemType",         ЭлементДанных.SystemType);
                    ПолученыеПараметры.Вставить
                КонецЦикла;
41 Serginio1
 
02.09.15
16:57
(37) А ты работаешь только с теми COM которые установлены? Или иногда и сам устанавливаешь необходимые библиотеки.
Из .Net ты можешь вытянуть,почти все что тебе угодно.
42 TormozIT
 
гуру
02.09.15
18:36
(41) Работает код в тиражной конфигурации на большом числе разных систем.
43 oleg_km
 
02.09.15
18:43
(42) Ну если ты ограничен в исходных, то что поделаешь - выкручивайся. А если я уже больше двух лет пользуюсь неограниченными возможностями .NET - то уже что-то и не знаю как без этого обойтись, а главное нафига себя ущемлять?
44 Serginio1
 
03.09.15
11:01
(43) Олег я тут добавил в файле реализацию ВК для получения Глобального контекста и его применения для создания подчиненого окна, вызова событий и методов глобального контекста
NetObjectToIDispatch - Ошибка при вызове конструктора (COMОбъект)

http://files.rsdn.ru/19608/FilesForNetObjectToIDispatch.zip
45 Asmody
 
03.09.15
11:07
(42) Тиражная конфигурация заточена под Windows?
46 TormozIT
 
гуру
03.09.15
14:16
(45) Да. Только у нее есть COM