PEB - NtQueryInformationnProcess не определен [дубликат]

Принимаемый ответ показывает слишком сложный способ. Как утверждает Форресто в его ответе , « он, кажется, добавляет их в DOM-проводник, но не на экран », и причиной этого являются разные пространства имен для html и svg.

Простейшим обходным решением является «обновление» всего svg. После добавления круга (или других элементов) используйте это:

$("body").html($("body").html());

Это делает трюк.

Или, если хотите, используйте контейнер div:

$("#cont").html($("#cont").html());

И заверните ваш svg внутри контейнера div:

Функциональный пример: http://jsbin.com/ejifab/1/edit

Преимущества этой техники:

  • вы может редактировать существующие svg (это уже в DOM), например. созданный с использованием Raphael или как в вашем примере «жестко закодированный» без скриптов.
  • вы можете добавить сложные структуры элементов как строки, например. $('svg').prepend('');, как вы делаете в jQuery.
  • после того, как элементы добавлены и сделаны видимыми на экране с помощью $("#cont").html($("#cont").html());, их атрибуты можно редактировать с помощью jQuery.

EDIT:

Вышеупомянутый метод работает с «жестко закодированным» или DOM манипулировал (= document.createElementNS и т. д.) только SVG. Если Raphael используется для создания элементов (согласно моим тестам), связь между объектами Рафаэля и SVG DOM нарушается, если используется $("#cont").html($("#cont").html());. Обходной путь к этому - не использовать $("#cont").html($("#cont").html()); вообще, а вместо него использовать фиктивный документ SVG.

Этот фиктивный SVG является первым текстовым представлением документа SVG и содержит только те элементы, которые необходимы. Если мы хотим, например. чтобы добавить элемент фильтра в документ Рафаэля, манекен может быть чем-то вроде . Текстовое представление сначала преобразуется в DOM с помощью метода jQuery $ ("body"). Append (). И когда элемент (filter) находится в DOM, он может быть запрошен с использованием стандартных методов jQuery и добавлен к основному документу SVG, который создается Raphael.

Почему этот манекен нужен? Почему бы не добавить элемент фильтра строго в созданный документ Рафаэля? Если вы попытаетесь использовать, например. $("svg").append(""), он создается как элемент html, и ничего не отображается на экране, как описано в ответах. Но если весь документ SVG добавляется, то браузер автоматически обрабатывает преобразование пространства имен всех элементов в документе SVG.

Пример иллюстрирует технику:

// Add Raphael SVG document to container element
var p = Raphael("cont", 200, 200);
// Add id for easy access
$(p.canvas).attr("id","p");
// Textual representation of element(s) to be added
var f = '';

// Create dummy svg with filter definition 
$("body").append('');
// Append filter definition to Raphael created svg
$("#p defs").append($("#dummy filter"));
// Remove dummy
$("#dummy").remove();

// Now we can create Raphael objects and add filters to them:
var r = p.rect(10,10,100,100);
$(r.node).attr("filter","url(#myfilter)");

Полная рабочая демонстрация этого метода находится здесь: http://jsbin.com/ilinan/1/edit .

(я еще не знаю, почему $("#cont").html($("#cont").html()); не работает при использовании Рафаэля. Это будет очень короткий взлом.)

21
задан user1169502 20 August 2015 в 10:02
поделиться

3 ответа

Мне нужно было это для работы с более старой версией VS-компилятора и более в рамках Qt. Вот как я это сделал.

Добавьте этот файл GetWinVersion.h в свой проект Qt:

#ifndef GETWINVERSION
#define GETWINVERSION

#include <QtGlobal>

#ifdef Q_OS_WIN

#include <windows.h>
#include <stdio.h>

float GetWinVersion()
{
    OSVERSIONINFO osvi;
    ZeroMemory( &osvi, sizeof(OSVERSIONINFO) );
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    return GetVersionEx( &osvi ) ?
           (float)osvi.dwMajorVersion +
           ((float)osvi.dwMinorVersion/10) :
           0.0 ;
}

#endif //Q_OS_WIN

#endif // GETWINVERSION

Добавьте необходимую ссылку в файл pro или pri qmake:

msvc: LIBS += -lKernel32

Реализовать вспомогательную функцию следующим образом (обратите внимание, что SystemInfo, используемая здесь, является моим собственным классом, но вы получаете идею ...):

#include "GetWinVersion.h"

SystemInfo info;

#ifdef Q_OS_WIN
    info.setPlatform( SystemInfo::WINDOWS );
    switch(QSysInfo::windowsVersion())
    {
    case QSysInfo::WV_32s:        info.setOsName( L"3.1" );     info.setOsVersion( 3.1 ); break;
    case QSysInfo::WV_95:         info.setOsName( L"95" );      info.setOsVersion( 4.0 ); break;
    case QSysInfo::WV_98:         info.setOsName( L"98" );      info.setOsVersion( 4.1 ); break;
    case QSysInfo::WV_Me:         info.setOsName( L"Me" );      info.setOsVersion( 4.9 ); break;
    case QSysInfo::WV_NT:         info.setOsName( L"NT" );      info.setOsVersion( 4.0 ); break;
    case QSysInfo::WV_2000:       info.setOsName( L"2000" );    info.setOsVersion( 5.0 ); break;
    case QSysInfo::WV_XP:         info.setOsName( L"XP" );      info.setOsVersion( 5.1 ); break;
    case QSysInfo::WV_2003:       info.setOsName( L"2003" );    info.setOsVersion( 5.2 ); break;  // Windows Server 2003, Windows Server 2003 R2, Windows Home Server, Windows XP Professional x64 Edition
    case QSysInfo::WV_VISTA:      info.setOsName( L"Vista" );   info.setOsVersion( 6.0 ); break;  // Windows Vista, Windows Server 2008
    case QSysInfo::WV_WINDOWS7:   info.setOsName( L"7" );       info.setOsVersion( 6.1 ); break;  // Windows 7, Windows Server 2008 R2
    case QSysInfo::WV_WINDOWS8:   info.setOsName( L"8" );       info.setOsVersion( 6.2 ); break;  // Windows 8, Windows Server 2012
  // These cases are never reached due to Windows api changes
  // As of Qt 5.5, this not accounted for by QSysInfo::windowsVersion()
  //case QSysInfo::WV_WINDOWS8_1: info.setOsName( L"8.1" );     info.setOsVersion( 6.3 ); break;  // Windows 8.1, Windows Server 2012 R2
  //case QSysInfo::WV_WINDOWS10:  info.setOsName( L"10" );      info.setOsVersion( 10.0 ); break; // Windows 10, Windows Server 2016
    default:
        // On Windows 8.1 & 10, this will only work when the exe
        // contains a manifest which targets the specific OS's
        // you wish to detect.  Else 6.2 (ie. Win 8.0 is returned)
        info.setOsVersion( GetWinVersion() );
        if(      info.osVersion() == 6.3f )  // Windows 8.1, Windows Server 2012 R2
            info.setOsName( L"8.1" );
        else if( info.osVersion() == 10.0f ) // Windows 10, Windows Server 2016
            info.setOsName( L"10" );
        else
            info.setOsName( L"UNKNOWN" );
    }
    info.setOsBits( IsWow64() ? 64 : 32 );
#else
...

Теперь вот реальный ключ. Вам нужно прикрепить файл манифеста к вашему exe, который будет «нацелен» на последние версии Windows, иначе вы не сможете их обнаружить (см. Документы MS: https://msdn.microsoft.com/en-us/ библиотека / окно / настольный / ms724451% 2 = vs.85% 29.aspx ). Вот пример манифеста, чтобы сделать это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity 
        name="MyOrg.MyDept.MyAppName" 
        version="1.0.0.0" 
        processorArchitecture="x86" 
        type="win32" />
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!-- Windows 10 --> 
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
            <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>      
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>          
        </application> 
    </compatibility>
</assembly>

И вот несколько пакетов для прикрепления манифеста:

set exeFile=MyApp.exe
set manifestFile=MyApp.manifest
set manifestExe=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\x64\mt.exe

"%manifestExe%" -manifest "%manifestFile%" -outputresource:"%exeFile%"

В теории вы можете использовать qmake для запуска этого последнего бита манифест. Мне не повезло с примерами, которые я нашел, и просто «обманул» эту партию на данный момент ...

1
ответ дан BuvinJ 16 August 2018 в 00:18
поделиться

Начиная с Windows 8.1, GetVersion() и GetVersionEx() подлежат проявлению приложения:

С выпуском Windows 8.1, поведение API GetVersionEx изменилось в значении, которое оно вернет для версии операционной системы. Значение, возвращаемое функцией GetVersionEx, теперь зависит от того, как проявляется приложение.

Приложения, которые не отображаются для Windows 8.1 или Windows 10, вернут значение версии ОС Windows 8 (6.2). Когда приложение проявляется для данной версии операционной системы, GetVersionEx всегда будет возвращать версию, в которой приложение проявляется в будущих выпусках. Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация вашего приложения на Windows .

Новые функции Version Helper просто обертки для VerifyVersionInfo() . Начиная с Windows 10, он также подвержен манифестации:

Windows 10: VerifyVersionInfo возвращает false при вызове приложениями, которые не имеют манифест совместимости для Windows 8.1 или Windows 10, если параметр lpVersionInfo установлен так, чтобы он указывал Windows 8.1 или Windows 10, даже если текущая версия операционной системы - Windows 8.1 или Windows 10. В частности, VerifyVersionInfo имеет следующее поведение:

  • Если приложение не имеет манифеста, VerifyVersionInfo ведет себя так, как если бы операционная система была версией Windows 8 (6.2).
  • Если приложение имеет манифест, содержащий GUID, соответствующий Windows 8.1, VerifyVersionInfo ведет себя так, как если бы операционная система была версией Windows 8.1 (6.3).
  • Если приложение имеет манифест, содержащий GUID, соответствующий Windows 10, VerifyVersionInfo ведет себя так, как если бы операционная система была Windows 10 (10.0).

Функции Version Helper используют функцию VerifyVersionInfo, поэтому поведение IsWindows8Point1OrGreater и IsWindows10OrGreater также подвержены влиянию присутствия и содержимого манифеста.

Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация на приложение для Windows .

Чтобы получить истинную версию ОС независимо от ее проявления, Microsoft предлагает запросить версию файла системной DLL:

Получение системы Версия

Чтобы получить полный номер версии для операционной системы, вызовите функцию GetFileVersionInfo в одной из системных DLL, например Kernel32.dll, затем вызовите VerQueryValue для получения подблока \\StringFileInfo\\<lang><codepage>\\ProductVersion информации о версии файла.

Другой способ - использовать RtlGetVersion() , NetServerGetInfo() , или NetWkstaGetInfo() . Они все сообщают точную версию ОС и не подлежат манифестации (пока?).

10
ответ дан Remy Lebeau 16 August 2018 в 00:18
поделиться
  • 1
    Я не понял «VerQueryValue» для получения подблока \\ StringFileInfo \\ & lt; lang & gt; & lt; codepage & gt; \\ ProductVersion информации о версии файла. & Quot; вашего ответа. Что такое & quot; \\ StringFileInfo \\ & lt; lang & gt; & lt; кодовая страница & gt; \\ ProductVersion & quot; представлять? что означает субблокировка информации о версии файла? – Sahil Singh 7 February 2018 в 10:59
  • 2
    @SahilSingh, что информация содержится в документации VerQueryValue(), и есть несколько примеров / учебников онлайн, показывающих, как использовать VerQueryValue(). Пожалуйста, найдите время, чтобы провести некоторое исследование, прежде чем задавать вопросы. – Remy Lebeau 7 February 2018 в 17:55

GetVersion и GetVersionEx заменялись вспомогательными функциями для различных версий . Вы хотите IsWindows10OrGreater . Они могут быть найдены в VersionHelpers.h .

IsWindows10OrGreater доступен только в последней версии SDK / Visual Studio 2015. Вы можете использовать IsWindowsVersionOrGreater в общем случае. Например, в моем ящике 7 я получаю TRUE для IsWindowsVersionOrGreater (6, 0, 0) .

Помните, что параметры, которые эта функция принимает, относятся к номеру сборки Windows и НЕму маркетинговому имени. Так что Windows 8 - это сборка 6.2. Windows 7 - 6.0 и т. Д.

14
ответ дан Robinson 16 August 2018 в 00:18
поделиться
  • 1
    BOOL WINAPI IsWindows10OrGreater(void);. Ничего себе, это отличный дизайн API. – M.M 20 August 2015 в 10:39
  • 2
    Это просто удобные функции. Существует общая функция IsWindowsVersionOrGreater . – Robinson 20 August 2015 в 10:45
  • 3
    проблема в том, что они недоступны в более ранних версиях Windows, на которых должен работать сканер. Могу ли я динамически загружать их, если они доступны? – user1169502 20 August 2015 в 12:31
  • 4
    Похоже, что ISWindows10OrGreater (или это более общий вариант, IsWindowsVersionOrGreater) не будет надежно указывать ОС. Поведение теперь зависит от того, как проявляется приложение «проявляется», что означает даже в Windows 10, приложение может сказать вам, что оно находится в Windows 8.1 или Windows 10. Если вы не нацелили приложение на Windows 10, оно всегда будет указывать вы Windows 8.1 – TheDuke 12 November 2015 в 23:02
  • 5
    Функции IsWindowsXXOrGreater() не являются фактическими функциями вообще, это всего лишь макро-обертки для функций VerifyVersionInfo(), которые теперь подвержены манифестации, начиная с Windows 10. – Remy Lebeau 26 August 2016 в 19:08
Другие вопросы по тегам:

Похожие вопросы: