Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420

Как определить абсолютный адрес каталога /WINDOWS/?

30.05.2017, 08:44. Показов 2821. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На компьютере имеется несколько операционных систем Windows, как программно можно узнать текущую OS и абсолютный адрес её каталога /WINDOWS/ ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2017, 08:44
Ответы с готовыми решениями:

Как преобразовать относительный адрес файла в абсолютный?
Я создал файл Как преобразовать относительный адрес в абсолютный? И как записать текст в этот файл? FileStream fCreate = new...

Как сделать массив-указатель на абсолютный адрес в FLASH?
Хочу сделать вот так: uint32_t addr=0x0801FC00; uint8_t CFG uint8_t * TCFG; TCFG= (uint8_t*) addr; int i;

Возможно ли в методе server.transfer использовать абсолютный адрес URL и как?
возможно ли в методе server.transfer использовать абсолютный адрес URL и как?

17
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
30.05.2017, 08:55
SHGetKnownFolderPath + FOLDERID_Windows или SHGetFolderPath + CSIDL_WINDOWS.
1
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
31.05.2017, 11:31  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
SHGetKnownFolderPath + FOLDERID_Windows или SHGetFolderPath + CSIDL_WINDOWS.
Я попробовал функцию SHGetFolderPath() с параметром CSIDL_WINDOWS:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vcl.h>
#include <shlobj.h>
 
#pragma hdrstop
#include "Unit1.h"
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  char szPath[MAX_PATH];
  if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, 0, szPath)))
  { 
    ShowMessage(AnsiString(szPath));
  }
}
Не знаю как там должно работать, но выскакивают ошибки:
E2238 Multiple declaration for 'FOLDELSETTINGS'
E2238 Multiple declaration for 'DESKBANDINFO'
...
и ссылка на файл shlobj.h

Добавлено через 12 часов 22 минуты
Цитата Сообщение от Инженер_3 Посмотреть сообщение
и ссылка на файл shlobj.h
Я ошибся. Ссылка на файл shobjidl.h
В shlobj.h на строке 115 есть подключение заголовочного файла shobjidl.h

Добавлено через 2 часа 52 минуты
Убежденный, Спасибо за имя функции.
Пришлось с бубном потанцевать.
Конфликт этих sh***.h с vcl.h, жаль, что у Борланда нет своих функций.
Если кому интересно, то:
C++
1
2
3
4
5
6
7
8
9
10
11
//dat.cpp
//нельзя подключать <vcl.h>
#include <shlobj.h>
#pragma hdrstop
#include "dat.h"
#pragma package(smart_init)
//АБСОЛЮТНЫЙ АДРЕС КАТАЛОГА /WINDOWS/
void F1(TCHAR *adr)
{
  SHGetFolderPath(NULL, CSIDL_WINDOWS, NULL, 0, adr);
}
C++
1
2
3
4
5
6
//dat.h
#ifndef datH
#define datH
//АБСОЛЮТНЫЙ АДРЕС КАТАЛОГА /WINDOWS/
void F1(TCHAR *adr);
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Unit1.cpp - использование
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "dat.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{ TCHAR adr[MAX_PATH];
  F1(adr);
  ShowMessage(AnsiString(adr));
}
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.06.2017, 20:46
Цитата Сообщение от Убежденный Посмотреть сообщение
SHGetKnownFolderPath + FOLDERID_Windows или SHGetFolderPath + CSIDL_WINDOWS.
Для универсальности лучше читать путь из переменной окружения %SystemRoot% контекста системы из параметра реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion => SystemRoot
т.к., например, на Windows Server с установленным компонентом служб терминалов, настроенных на режим выполнения приложений (change user /execute) функции SHGetKnownFolderPath, SHGetFolderPath, GetWindowsDirectory будут сообщать не c:\Windows, а указывать на несуществующую папку внутри папки профиля текущего пользователя, нечто вроде: c:\users\user\windows.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.06.2017, 23:01
М-м... Любопытная информация, никогда с такой настройкой не сталкивался.
Очень хочу либо подтвердить, либо опровергнуть (ибо работаю с кодом, где SHGetFolderPath
много где используется). Не подскажешь подробнее, что за настройки такие и где/как их включить?
О результатах обещаю подробно написать.

Цитата Сообщение от Dragokas Посмотреть сообщение
лучше читать путь из переменной окружения %SystemRoot% контекста системы
Это выглядит как явный overkill - для получения пути к папке Windows переключаться в
контекст системной учетки... Должен быть простой и верный путь.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.06.2017, 04:29
Цитата Сообщение от Убежденный Посмотреть сообщение
М-м... Любопытная информация, никогда с такой настройкой не сталкивался.
Очень хочу либо подтвердить, либо опровергнуть (ибо работаю с кодом, где SHGetFolderPath
много где используется). Не подскажешь подробнее, что за настройки такие и где/как их включить?
А на эту удочку ловятся многие разработчики, даже в антивирусной индустрии.

Инструкция для Windows 2000 (и скорее всего 2003) Server
1. Заходишь в Панель управления\Программы\Программы и компоненты => Установка компонентов.
2. В компонентах => если стоит галочка на "Службы терминалов", то снимаешь её, удаляешь компонент, перезагружаешься.
3. Снова сюда заходишь, ставишь галочку на "Службы терминалов", Далее, появится ещё окно => выбираешь вариант "Режим сервера приложений" => дальше не важно, любые опции, ставишь, перезагружаешься.
Открываешь ком. строку, проверяешь:
Windows Batch file
1
change user /query
Сервер должен быть в режиме "выполнения приложений"
Если это не так, применяешь команду:
Windows Batch file
1
change user /execute
Всё, можешь проверять.
Чтобы вернуть дефолтовое поведение, выполняешь команду:
Windows Batch file
1
change user /install
Инструкция для Windows 2008 Server и выше
Выполни только 1-ю часть этого руководства: http://ps523.ru/installing-terminal-server/
После перезагрузки, можешь проверять.
Также см. описанные мною выше команды ком. строки. Они здесь тоже применимы (при запуске с повышенными привилегиями).

Мною проверено такое поведение в системах Windows 2000 Server и Windows Server 2008 R2.
Путь %userprofile%\windows выдают все 3 функции:
  • SHGetKnownFolderPath + FOLDERID_Windows (начиная с Server 2008)
  • SHGetFolderPath + CSIDL_WINDOWS
  • GetWindowsDirectory
Цитата Сообщение от Убежденный Посмотреть сообщение
О результатах обещаю подробно написать.
Да, будет интересно, что это за эмуляция. Как работает и на какие ещё функции влияет.

Цитата Сообщение от Убежденный Посмотреть сообщение
Это выглядит как явный overkill - для получения пути к папке Windows переключаться в
контекст системной учетки... Должен быть простой и верный путь.
Ну для этого достаточно было бы просто прочитать блок переменных окружения любого процесса, запущенного от Local System, хотя это не особо надёжно, т.к. такой блок переменных можно подменить.
Но, я предлагал другое: прочитать значение переменной %SystemRoot% из параметра реестра, откуда система сама должна брать его значение. Вообще, это довольно интересная и необычная тема, по которой я никак не допишу статью. Дело в том, что по-умолчанию, значения переменных окружения для контекста системы берутся из-под ключа:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl Set\Control\Session Manager\Environment
Там можно увидеть, например, %Windir%, но он ссылается на ту самую SystemRoot, в виду важности которой её куда-то спрятали. Я раньше всегда предполагал, что это параметр:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion => SystemRoot
Однако, я только что провёл эксперимент, изменив значения этого параметра. Система после такого, по идее вообще не должна была загрузиться. Но она загрузилась и кроме того ещё и перезаписала значение этого параметра (!). Так что, откуда она берёт значение для меня пока загадка.

P.S. Раскрывать SystemRoot через ExpandEnvironmentStrings принципиально не предлагаю, т.к. такое приложение можно было бы легко "сломать", перезаписав значение перед запуском процесса, который её унаследует, хотя бы через туже ком. строку:
Windows Batch file
1
cmd /c set SystemRoot=c:\bad & program.exe
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.06.2017, 09:02
Цитата Сообщение от Dragokas Посмотреть сообщение
Мною проверено такое поведение в системах Windows 2000 Server и Windows Server 2008 R2.
Путь %userprofile%\windows выдают все 3 функции:
SHGetKnownFolderPath + FOLDERID_Windows (начиная с Server 2008)
SHGetFolderPath + CSIDL_WINDOWS
GetWindowsDirectory
А имеет ли значение, из какой сессии (консольная или RDP) выполняется код с SHGetFolderPath/etc?

---

Все это пока выглядит очень подозрительно для меня, ибо написал уже немало программ и
компонентов, которые работают на сервере терминалов (от Srv2003 до Srv2012R2 включительно),
нигде такого поведения не видел (ну или до этого дня не обращал внимания).

В любом случае, большое спасибо, как появится время - обязательно проверю все это и отпишусь.

Цитата Сообщение от Dragokas Посмотреть сообщение
Однако, я только что провёл эксперимент, изменив значения этого параметра. Система после такого, по идее вообще не должна была загрузиться. Но она загрузилась и кроме того ещё и перезаписала значение этого параметра (!). Так что, откуда она берёт значение для меня пока загадка.
Скорее всего, SystemRoot берется из пространства имен диспетчера объектов.
Попробуй поищи ее с помощью WinObj (Sysinternals), это же просто символьная ссылка...
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
03.06.2017, 13:57
Убежденный, ну да, это жесткий фейл с моей стороны. Оказывается бага проявляется только из-под рантайма VB6 и дельфи.
Из C++ попробовал такой код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <tchar.h>
#include <windows.h>
#include <Wtsapi32.h>
#include <Shlobj.h>
#include <VersionHelpers.h>
 
#pragma comment (lib, "Wtsapi32.lib")
 
int _tmain(int argc, _TCHAR *argv[])
{
    BOOL bRDP = FALSE;
    DWORD dwSessID = -1;
    ProcessIdToSessionId(GetCurrentProcessId(), &dwSessID);
    DWORD dwSz;
    LPTSTR ppBuffer = NULL;
    if (WTSQuerySessionInformation(NULL, dwSessID, WTSClientProtocolType, &ppBuffer, &dwSz))
    {
        bRDP = *(USHORT*)ppBuffer == 2;
        WTSFreeMemory(ppBuffer);
    }
 
    _tprintf(_T("%s\n"), !bRDP ? _T("Console Session") : _T("RDP Session"));
 
    TCHAR buff[MAX_PATH] = {0};
 
    GetWindowsDirectory(buff, sizeof(buff));
    _tprintf(_T("GetWindowsDirectory: %s\n"), buff);
 
    SecureZeroMemory (&buff, sizeof(buff));
    SHGetFolderPath(NULL, CSIDL_WINDOWS, 0, NULL, buff);
    _tprintf(_T("SHGetFolderPath: %s\n"), buff);
 
    CoInitialize(NULL);
 
    if (IsWindowsVistaOrGreater()) {
        TCHAR* path = 0;
        SHGetKnownFolderPath(FOLDERID_Windows, KF_FLAG_NOT_PARENT_RELATIVE | KF_FLAG_DEFAULT_PATH, NULL, &path);
        _tprintf(_T("SHGetKnownFolderPath: %s\n"), path);
        CoTaskMemFree(path);
    }
 
    SecureZeroMemory(&buff, sizeof(buff));
    ExpandEnvironmentStrings(_T("%SystemRoot%"), buff, sizeof(buff));
    _tprintf(_T("%%SystemRoot%%: %s\n"), buff);
 
    system("pause");
}

Вывод нормальный:
Console Session
GetWindowsDirectory: C:\Windows
SHGetFolderPath: C:\Windows
SHGetKnownFolderPath: C:\Windows
%SystemRoot%: C:\Windows
Уже не в первый раз попадаюсь на том, что одинаковый код работает работает совсем по-разному на разных языках.

Цитата Сообщение от Убежденный Посмотреть сообщение
Скорее всего, SystemRoot берется из пространства имен диспетчера объектов.
Попробуй поищи ее с помощью WinObj (Sysinternals), это же просто символьная ссылка...
Спасибо.
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.06.2017, 08:59
Цитата Сообщение от Dragokas Посмотреть сообщение
Оказывается бага проявляется только из-под рантайма VB6 и дельфи.
И все-таки мне было бы интересно узнать, чем вызывается такое поведение.
Функции-то одни и те же (я имею в виду Win32 API). Что это тогда?
Виртуализация системы (а-ля Registry Redirector / File Redirector)?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.06.2017, 16:44
Я бы мог согрешить на какой-нибудь Compatiblity shim, но у меня всё собрано как положено с манифестом совместимости.
Есть предположение, что система подменяет функции, когда по неизвестным мне принципам находит в приложении некую несовместимость, точно так же как если бы мы пытались проверить версию системы через чтение:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows NT\CurrentVersion => ProductName
когда в свойствах стоит галочка: "Запускать программу в режиме совместимости с ..."

Вот EXE-шник VB6 с сорцами, оконный аналог сишного кода. Можешь попробовать отдебажить.
Собранного Дельфи нет, но например, AVZ от Зайцева этой же бедой страдает.
Вложения
Тип файла: zip GetWinDir.zip (9.5 Кб, 4 просмотров)
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
04.06.2017, 20:43
Dragokas, спасибо, полезная информация.

Цитата Сообщение от Dragokas Посмотреть сообщение
Оказывается бага проявляется только из-под рантайма VB6 и дельфи.
Ничего подобного, я потестил чистый сэмпл (никакого стартап кода, на EP сразу вызов GetWindowsDirectoryW) и бага проявилась. Тестил на Windows Server 2003. Вот код GetWindowsDirectoryW:

Assembler
1
2
3
4
5
6
7
8
77E6C72A > 8BFF             MOV EDI,EDI
77E6C72C   55               PUSH EBP
77E6C72D   8BEC             MOV EBP,ESP
77E6C72F   A1 1CD1EC77      MOV EAX,DWORD PTR DS:[77ECD11C]
77E6C734   85C0             TEST EAX,EAX
77E6C736   0F85 67860000    JNZ kernel32.77E74DA3
77E6C73C   5D               POP EBP
77E6C73D  ^E9 A0CDFFFF      JMP kernel32.GetSystemWindowsDirectoryW
Если не настраивать систему, как вы описали, то по адресу 77ECD11C (переменная в kernel32.dll) NULL, и прыжка не будет. Вызовется GetSystemWindowsDirectoryW которая возвращает верный путь. Если настроить то там лежит некая tsappcmp.TermsrvGetWindowsDirectoryW, после прыжка она вызывается и возвращает "плохой" путь. SHGetKnownFolderPath и SHGetFolderPath не смотрел, но суть должна быть та же. В общем получается, верный способ, это использовать GetSystemWindowsDirectory.

Добавлено через 6 минут
GetSystemWindowsDirectory
On a system that is running Terminal Services, each user has a unique Windows directory. The system Windows directory is shared by all users, so it is the directory where an application should store initialization and help files that apply to all users.

With Terminal Services, the GetSystemWindowsDirectory function retrieves the path of the system Windows directory, while the GetWindowsDirectory function retrieves the path of a Windows directory that is private for each user. On a single-user system, GetSystemWindowsDirectory is the same as GetWindowsDirectory.
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.06.2017, 08:55
Цитата Сообщение от jupman Посмотреть сообщение
Вызовется GetSystemWindowsDirectoryW которая возвращает верный путь. Если настроить то там лежит некая tsappcmp.TermsrvGetWindowsDirectoryW, после прыжка она вызывается и возвращает "плохой" путь.
Еще немного полезной информации здесь:

GetWindowsDirectory function
https://msdn.microsoft.com/ru-... s.85).aspx
Terminal Services: If the application is running in a Terminal Services environment, each user has a private Windows directory. There is also a shared Windows directory for the system. If the application is Terminal-Services-aware (has the IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER _AWARE flag set in the image header), this function returns the path of the system Windows directory, just as the GetSystemWindowsDirectory function does. Otherwise, it retrieves the path of the private Windows directory for the user.
----

Цитата Сообщение от jupman Посмотреть сообщение
SHGetKnownFolderPath и SHGetFolderPath не смотрел, но суть должна быть та же. В общем получается, верный способ, это использовать GetSystemWindowsDirectory.
Не могу в это поверить Ибо MSDN пишет, что "This function is provided primarily for compatibility.
Applications should store code in the Program Files folder and persistent data in the Application
Data folder in the user's profile. For more information, see ShGetFolderPath".

jupman, ты не мог бы проверить поведение SHGetKnownFolderPath/SHGetFolderPath у себя?
При условии, что у приложения есть манифест и флаг IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER _AWARE в
заголовке PE?..
2
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
05.06.2017, 09:28
Цитата Сообщение от Убежденный Посмотреть сообщение
ты не мог бы проверить поведение SHGetKnownFolderPath/SHGetFolderPath ...
Могу. Вечером проверю.
0
05.06.2017, 09:32

Не по теме:

Спасибо. Я сейчас в отпуске и нет возможности проверить. Хотя очень хочется :)

0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
05.06.2017, 14:24
Убежденный, тестировал на Windows Server 2008 X64 SP2.

С манифестом и при установленном флаге (IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVE R_AWARE):

GetWindowsDirectory: C:\Windows
SHGetFolderPath: C:\Windows
SHGetKnownFolderPath: C:\Windows
GetSystemWindowsDirectory: C:\Windows
С манифестом и при сброшенном флаге:

GetWindowsDirectory: C:\Users\Administrator\WINDOWS
SHGetFolderPath: C:\Users\Administrator\WINDOWS
SHGetKnownFolderPath: C:\Users\Administrator\WINDOWS
GetSystemWindowsDirectory: C:\Windows
Если убрать манифест то результат обоих тестов такой же.

Добавлено через 9 минут
Цитата Сообщение от Dragokas Посмотреть сообщение
Оказывается бага проявляется только из-под рантайма VB6 и дельфи.
Скорей всего дело во флаге.

Добавлено через 1 час 11 минут

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
Я сейчас в отпуске и нет возможности проверить
Ты плохо подготовился. Грузишь в машину: портативную электростанцию, канистру бензина для нее, тарелку для спутникового интернета, Руссиновича (книгу), ПК, перефирию для ПК, кресло и большую палатку. Все. Можно ехать на рыбалку. :)

2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.06.2017, 15:35
jupman, спасибо за исследование. Весьма полезная инфа. Теперь буду использовать GetSystemWindowsDirectory().
Выходит, что некоторые версии студии по-умолчанию собирают бинарь без флага IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER _AWARE ?

Теперь вопрос, как правильно собрать (пропатчить?) бинарь для добавления ему совместимости с TS, если компилятор (VB6, Delphi(?)) не имеет такой явной опции. Безопасно ли просто добавить флаг к DllCharacteristics? Вот здесь комментатор пишет:

https://blogs.msdn.microsoft.c... 0/?p=45581

Цитата Сообщение от skSdnW
There is a difference between linking with /TSAWARE and adding the flag later with editbin. When you link with /TSAWARE the MS linker will try extra hard to layout the PE sections in a way so that the read-only sections can be shared between instances, this can sometimes make your .exe slightly larger than linking without /TSAWARE (Depends on compiler/linker flags used and linker version). No matter how the flag was set, at runtime you will escape the %windir% compatibility shim in Terminal Server scenarios.
т.е. если я добавлю флаг через патч, есть риск нарваться на exception, если будет запрошена операция чтения не расшаренной read-only секции?

Цитата Сообщение от Убежденный
Скорее всего, SystemRoot берется из пространства имен диспетчера объектов.
Попробуй поищи ее с помощью WinObj (Sysinternals), это же просто символьная ссылка...
Не знаю, в каком именно пространстве имён смотреть, но вроде ни в одном из них подобного названия нет. И всё-таки интересно было бы узнать, откуда система берёт это значение.

Добавлено через 9 минут
А вот собственно и список вещей, на которые влияет Remote Desktop Services Application Compatibility layer:
https://msdn.microsoft.com/en-... s.85).aspx
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
05.06.2017, 17:55
Цитата Сообщение от Dragokas Посмотреть сообщение
Выходит, что некоторые версии студии по-умолчанию собирают бинарь без флага IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER _AWARE ?
Незнаю. У меня (Visual Studio 2008) по умолчанию флаг стоит. Настройка расположена: Linker -> System -> Terminal Server. Опции комстроки: /TSAWARE и /TSAWARE:NO.
Цитата Сообщение от Dragokas Посмотреть сообщение
т.е. если я добавлю флаг через патч, есть риск нарваться на exception, если будет запрошена операция чтения не расшаренной read-only секции?
Не вижу проблемы. Чтения нерасшаренной read-only секции исключения не даст. Кстати, два сэмпла из под VS2008, с установленным флагом и без, идентичны. Отличие только в поле IMAGE_OPTIONAL_HEADER32.DllCharacteristi cs одним битом.
Цитата Сообщение от Dragokas Посмотреть сообщение
Теперь вопрос, как правильно собрать (пропатчить?) бинарь для добавления ему совместимости с TS, если компилятор (VB6, Delphi(?)) не имеет такой явной опции. Безопасно ли просто добавить флаг к DllCharacteristics?
Думаю да.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
05.06.2017, 23:28
Цитата Сообщение от jupman Посмотреть сообщение
Убежденный, тестировал на Windows Server 2008 X64 SP2.
...
Спасибо, чрезвычайно полезная информация!!!

Не по теме:


Цитата Сообщение от jupman Посмотреть сообщение
тарелку для спутникового интернета, Руссиновича (книгу), ПК, перефирию для ПК...
Не-не-не, никаких ПК и Руссиновичей, я это и так вижу 365 дней в году, 7 дней в неделю.
Так можно и совсем "остыть" к программированию, а в нашей профессии это равносильно смерти...
Так что мне полагается банька, озеро, шашлычок, свежий воздух и приятная компания :)



Цитата Сообщение от Dragokas Посмотреть сообщение
Не знаю, в каком именно пространстве имён смотреть, но вроде ни в одном из них подобного названия нет.
А как же это:

?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.06.2017, 23:28
Помогаю со студенческими работами здесь

Абсолютный адрес байта
Помогите пожалуйста определить абсолютный адрес байта. Задача была такая Выполнить арифметическую операцию A*X*X+B*X+C Преподаватель...

Найти абсолютный адрес байта
Даны команды: 1. mov dx, 40h 2. add ax, bx 3. mov al, Для каждой нужно найти абсолютный адрес байта. Как это можно сделать?

Определить IP-адрес PPTP-адаптера под Windows?
Не сочтите за дерзость: создавал тему в разделе для чайников - никто не ответил.. Может здесь правильные люди наткнутся.. :) Доброго...

Как определить IP-адрес сети, зная IP-адрес узла назначения и маску сети
Добрый вечер, форумчане! Дали задачку одну: &quot;Найти IP-адрес сети, зная IP-адрес узла назначения=12.34.56.83 и маску...

Адрес/путь окна каталога
Здравствуйте. Помогите решить одну проблему, уже много времени над ней мучаюсь. Мне нужно узнать полный путь к окну каталога, максимум, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru