Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

destiny_child



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
собрал манифест из ваших элементов, зашил в ресурсы, собрал ехе - и теперь процесс запускается как надо. а ошибку в дебагере реально этот к юти вносил. уж не знаю, по какому разумению он данные из едитбокса "Параметры командной строки" брал и конвертил в utf8 и уже именно их подавал на вход запускаемому ехе, но.... эт точно. пересобрал часть проекта под студией дома и вуаля - проблем больше нет....
что ж всем огромное спасибо за посильную помощь!

Всего записей: 3275 | Зарегистр. 01-04-2006 | Отправлено: 22:49 17-04-2019
m00slim25



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здраствуйте!
Подскажите, какими функциями можно получить параметры уже запущенного процесса? Допустим строку запуска процесса и его рабочую папку.
И можно ли вызывать эти функции через RunDLL/CallDLL ?

Всего записей: 1039 | Зарегистр. 30-05-2006 | Отправлено: 06:59 08-06-2019 | Исправлено: m00slim25, 07:00 08-06-2019
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
m00slim25

Цитата:
Допустим строку запуска процесса
для начала классика не подойдёт?
 
int _tmain(int argc, TCHAR *argv[])
  _tprintf("запуск ЕХЕ = %s\n", argv[0]);
 

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 12:48 08-06-2019
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если параметры чужого процесса, то:

Код:
 
#include <windows.h>
#include <winternl.h>
#include <stdio.h>
 
typedef DWORD (__stdcall *ptrNtQueryInformationProcess)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG);
 
static DWORD getProcessPid(char* procName)
{
    //todo
    return 0xD60;
}
 
int main()
{
    HANDLE h;
    DWORD len, pid;
    SIZE_T tmp;
    PUNICODE_STRING pus;
    PPROCESS_BASIC_INFORMATION pbi;
    PRTL_USER_PROCESS_PARAMETERS upp;
    ptrNtQueryInformationProcess NtQueryInformationProcess;
    PPEB peb;
    unsigned char buf[0x400];
 
    if((pid = getProcessPid("notepad.exe")))
    {
        if((h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_TERMINATE, FALSE, pid)))
        {
            tmp = sizeof(buf);
            NtQueryInformationProcess = (ptrNtQueryInformationProcess)GetProcAddress(GetModuleHandle("ntdll"), "NtQueryInformationProcess");
            NtQueryInformationProcess(h, ProcessBasicInformation, buf, sizeof(PROCESS_BASIC_INFORMATION), &len);
 
            tmp = sizeof(buf);
            pbi = (PPROCESS_BASIC_INFORMATION)buf;
            ReadProcessMemory(h, pbi->PebBaseAddress, buf, sizeof(PEB), &tmp);
 
            tmp = sizeof(buf);
            peb = (PPEB)buf;
            ReadProcessMemory(h, peb->ProcessParameters, buf, sizeof(RTL_USER_PROCESS_PARAMETERS), &tmp);
 
            tmp = sizeof(buf);
            upp = (PRTL_USER_PROCESS_PARAMETERS)buf;
            ReadProcessMemory(h, upp->ImagePathName.Buffer, buf, upp->ImagePathName.MaximumLength, &tmp);
            printf("%ls\n", buf);
            
            tmp = sizeof(buf);
            ReadProcessMemory(h, upp->CommandLine.Buffer, buf, upp->CommandLine.MaximumLength, &tmp);
            printf("%ls\n", buf);
        }
    }
    return 0;
}
 
 
 

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 14:37 08-06-2019
ManHunter



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Неоднократно встречал на разных ресурсах вот такой код, который якобы загружает картинку из файла и затем рисует ее на десктопе.
 

Код:
HANDLE Handle;
     
// Загрузка в Handle битмапа
HRESULT LoadOLE(wchar_t* FileName){      
      HRESULT Result;
      tagFORMATETC fmt;
      tagSTGMEDIUM stg;
      ILockBytes *FLockBytes=0;
      IStorage *iStorage=0;
      IDataObject *Data=0;
      if ((Result =CreateILockBytesOnHGlobal(0, 1, &FLockBytes))!=0) return Result;
      if ((Result =StgCreateDocfileOnILockBytes(FLockBytes, STGM_READWRITE
        | STGM_SHARE_EXCLUSIVE | STGM_CREATE, 0, &iStorage))!=0){
          FLockBytes->Release();
          FLockBytes=0;
          return Result;
          };
      fmt.cfFormat = CF_BITMAP;
      fmt.dwAspect=1;
      fmt.lindex=-1;
      fmt.ptd=0;
      fmt.tymed=2;
      Result =OleCreateFromFile(CLSID_Picture_Dib,FileName,
       IID_IDataObject,OLERENDER_NONE,&fmt,0,iStorage,(void**)&Data);
      if (Result==0) Result =OleRun(Data);
      if (Result==0) Result =Data->GetData(&fmt,&stg);
      if (Result==0) Handle = stg.hBitmap;
      if (Data) Data->Release();       Data=0;
      iStorage->Release();   iStorage=0;
      FLockBytes->Release(); FLockBytes=0;
     // return Result;    
    // Отрисовка Handle битмапа
    HDC dest = GetDC(0 /*Дескриптор окна*/); // допустим монитор
    HDC dc =  CreateCompatibleDC(0);
    SelectObject(dc,Handle);
    BitBlt(dest,x,y,xx,yy, dc,0,0,SRCCOPY);  
    ReleaseDC( 0 /*Дескриптор окна*/, dest);
}

 
У кого-нибудь он в таком виде вообще работает? Понятно дело, надо добавить все #include и вызов функции, я имею в виду работоспособность самой LoadOLE.
 
Про OleLoadPicture и GDI+ знаю и умею, хотелось бы разобраться именно с получением хэндла битмапа через OleCreateFromFile

----------
"На любое мое движение ваша реакция предусмотрена,
В лучшем случае - равнодушие, в худшем случае - патология..." (C) Егор Летов

Всего записей: 3091 | Зарегистр. 20-03-2004 | Отправлено: 15:43 05-09-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Перерыл весь форум, но более близкой и относительно живой темы не нашел. Заранее прошу прощения за возможный оффтопик и надеюсь на ваше великодушие. Кто-нибудь может объяснить разницу в реализации Common Controls 6.0 в WinXP и Win 7/8/10?  
Чтобы было понятно, к примеру, подсветка активного элемента ListView в uTorrent под XP выглядит вот так, а должна выглядеть как в 7/8/10, то есть вот так. В реверс-инжениринге я не силен, но беглый анализ показал, что корректное поведение тесно связано с определенной версией Common Controls 6.0, а также с манифестом, опубликованным на предыдущей странице. К сожалению, продвинуться дальше мне не удалось, поэтому прошу помощи клуба, чтобы понять, чего именно не хватает в Common Controls под XP.  

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 21:27 30-09-2019 | Исправлено: Vasily_Koshkin, 21:30 30-09-2019
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vasily_Koshkin

Цитата:
подсветка активного элемента ListView в uTorrent под XP выглядит вот так, а должна выглядеть как в 7/8/10

Почему должна? XP как бы ничего не знает, что там в новых виндах.

Всего записей: 10456 | Зарегистр. 05-02-2003 | Отправлено: 06:19 01-10-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Почему должна? XP как бы ничего не знает, что там в новых виндах.

Вот я и хочу понять, чего именно XP не знает.
 
PS. Насколько я понимаю, программу в XP всерьёз никто не тестирует, ее просто продолжают собирать с поддержкой XP на автомате.  
Возможно, разработчики даже не видят этого безобразия и уж тем более не придают ему никакого значения.  

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 17:19 01-10-2019 | Исправлено: Vasily_Koshkin, 17:20 01-10-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Дллшки отрисовки контролов разные, что тут непонятного?

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 17:23 01-10-2019
yamn2020

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
гуглите regions в winapi, судя по всему ядро срёт с помощью этого "волшебного слова" в видеопамять, если вам уж очень глубоко надо...моё так далеко не ходило...
upd. https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-extcreateregion вот это делает всю работу по "новой windows", imho, ну а там gdi+,gdi и работа напрямую с видеопамятью, ring0 когда так глубоко опускаешься, главное: "форму содержанием не заляпать", как говорил губернатор красноярского края ныне покойный евдокимов

Всего записей: 59 | Зарегистр. 22-12-2018 | Отправлено: 18:23 01-10-2019 | Исправлено: yamn2020, 18:35 01-10-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

Цитата:
Дллшки отрисовки контролов разные, что тут непонятного?

Это как раз понятно. Меня конкретика интересует - насколько разные, в каком месте разные? Реально ли компенсировать отсутствие нужного функционала с помощью самодельного враппера? Или Вы имеете в виду, что проблема отнюдь не в Common Controls?  

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 20:52 01-10-2019 | Исправлено: Vasily_Koshkin, 21:00 01-10-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если программа использует нативные виндовые common controls - тогда в них. Разница может быть любой глубины - как в банально разных цветах оформления винды, так и где то глубоко в коде неведомой дллшки (другой, не той, которая на виду).  
Для того, чтоб унифицировать вид и поведение контролов, а также расширить их функциональность,ещё со времен 3 винды доступен механизм owner draw. В дельфи, например, есть куча библиотек с такими контролами.  
Да, враппер для этого сочинить можно, но он по сути ничем не будет отличаться от мини-библиотеки таких вот owner draw controls.

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 22:25 01-10-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

Цитата:
Для того, чтоб унифицировать вид и поведение контролов, а также расширить их функциональность,ещё со времен 3 винды доступен механизм owner draw. В дельфи, например, есть куча библиотек с такими контролами.

Альтернативные библиотеки контролов - это, конечно, хорошо. А разве можно таким образом повлиять на работу другой программы (допустим, того же uTorrent'a)?  
 
Добавлено:
yamn2020

Цитата:
гуглите regions в winapi, судя по всему ядро срёт с помощью этого "волшебного слова" в видеопамять, если вам уж очень глубоко надо...

Благодарю за наводку, почитал с интересом. Осознал, что в умелых руках возможности использования регионов поистине безграничны, но, как и Вы, решил пока не нырять слишком глубоко. Получается, как "из пушки по воробьям".

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 17:17 02-10-2019 | Исправлено: Vasily_Koshkin, 17:34 02-10-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Конечно. Если в папке программы лежит либа с тем же именем, что и системная - она подменяет собой системную.  
Например, специально написанная либа-враппер advapi32.dll может использоваться для портабелизации приложения, подменяя обращения к реестру обращениями к лежащему рядом (те все там же, в папке программы) файлу...
Правда, как это всё сработает с механизмом sxs и манифестом - хз...

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 17:37 02-10-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MERCURY127

Цитата:
Если в папке программы лежит либа с тем же именем, что и системная - она подменяет собой системную.

Так должно быть в теории. На практике у меня был неудачный опыт использования враппера к ws2_32.dll для реализации функций inet_ntop() и inet_pton(). Пришлось выкручиваться путем переименования dll-ки и соответствующего патча подопытного exe-шника.  

Цитата:
Правда, как это всё сработает с механизмом sxs и манифестом - хз...

Вот и я о том же - не пойму, как это должно работать.
 

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 18:38 02-10-2019 | Исправлено: Vasily_Koshkin, 18:50 02-10-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По идее должен работать самый простой код:

Код:
private void Form_Load(object sender, EventArgs e)
{
    lv.OwnerDraw = true;
}
 
private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    if (e.Item.Selected)
    {
        lvix.BackColor = Color.SkyBlue;
        lvix.ForeColor = Color.Black;
    }
    else
    {
        lvix.BackColor = Color.White;
        lvix.ForeColor = Color.Black;
    }
 
    e.DrawBackground();
    e.DrawText();
}

Но editable items на него не реагируют.

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 01:21 04-10-2019 | Исправлено: Vasily_Koshkin, 01:26 04-10-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
народ! помогите понять!
 
делаю так (32 битный ехе):
 
TEST.EXE - любой 32 битный.
 
на x86 - работает.
на 7 x64 - ничего не запускает.

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 21:02 18-10-2019 | Исправлено: MERCURY127, 21:04 18-10-2019
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
...
 _spawnl( _P_NOWAIT, buf, buf, NULL);
...
 memset(&si, 0, sizeof(si));
 si.cb = sizeof(si);
 CreateProcess( buf, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
...

Всего записей: 1525 | Зарегистр. 01-11-2004 | Отправлено: 23:41 18-10-2019
MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
_spawnl( _P_NOWAIT, buf, buf, NULL);
действительно, работает...  
спасибо

Всего записей: 11539 | Зарегистр. 03-08-2008 | Отправлено: 11:24 19-10-2019
Vasily_Koshkin



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Разбираясь с механизмом работы LoadLibrary, случайно наткнулся на любопытный пост.  

Цитата:
Почему-то везде в интернете ходит один и тот же неправильный прототип nt-функции LdrLoadDll


Код:
 
NTSYSAPI NTSTATUS NTAPI LdrLoadDll(
     _In_opt_ PWSTR DllPath,
     _In_opt_ PULONG DllCharacteristics,
     _In_ PUNICODE_STRING DllName,
     _Out_ PVOID *DllHandle
     );
 


Цитата:
... в неправильном прототипе указан тип первого параметра - PWSTR DllPath. Кто-то не до конца понял, что это не путь к Dll, а флаг поиска, который система реализует сама.


Код:
 
typedef NTSTATUS(__fastcall* _LdrLoadDll)(
     _In_opt_ UINT32 Flags,
     _In_opt_ PUINT32 Reserved,
     _In_ PUNICODE_STRING ModuleFileName,
     _Out_ HMODULE* ModuleHandle
     );
 _LdrLoadDll LdrLoadDll;
 

Неужели все в мире более десяти лет использовали неправильный прототип и никто ничего не заметил? И если всё написанное соответствует действительности, то как же на самом деле работает этот загадочный механизм поиска DLL, "который система реализует сама"?  

Всего записей: 1377 | Зарегистр. 07-02-2004 | Отправлено: 21:13 01-11-2019 | Исправлено: Vasily_Koshkin, 21:38 01-11-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru