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

Переписать WinApi функцию с Delphi на манер С++

17.08.2014, 18:53. Показов 677. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Пытаюсь адаптировать функцию с делфи на Ся.

Delphi
1
2
3
  vPointer: Pointer;
  vItem: TLVItem;
  vItem.pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
Я делаю так

C++
1
2
3
  HANDLE vPointer; // указатель на область выделенной памяти в чужом процессе 
  LVITEM vItem;
  vItem.pszText = LPWSTR(int(vPointer) + sizeof(LVITEM));
Потом я пытаюсь сделать wprintf(vItem.pszText) но получаю access violaton.
Наверное, я неправильно привел типы. Где я облажался?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.08.2014, 18:53
Ответы с готовыми решениями:

Как переписать код на современный манер?
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) Вот такое объявление...

Переписать функцию с C на Delphi
void * TestFunc(void * a, int i) { return (RSize *)a + (2 + i); } Как это перевести в Delphi ??? Вот вариант

Как переписать программу из windowsForms под WinAPI
Ребята, помогите, пожалуйста, переписать код так, что бы для работы программы не использовались Netfraemwork и DotNet (как я понимаю надо...

4
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
17.08.2014, 19:26
C
1
2
3
  HANDLE vPointer; // указатель на область выделенной памяти в чужом процессе 
  LVITEM vItem;
  vItem.pszText = LPWSTR(int(vPointer) + sizeof(LVITEM));
Нужно больше кода, чтобы было понятно что к чему. Как минимум тот кусок, что инициализирует vPointer и тот, что печатает.
0
19 / 18 / 1
Регистрация: 06.09.2012
Сообщений: 110
17.08.2014, 20:30
Если я не ошибаюсь то так:
1) VPointer: Pointer; - я сначала подумал что тут указатель но нет, должно иметь вид:
C
1
void *vPointer(); // Где то у вас должна быть сама функция, возможно ее тут объявляют так как она не глобальна
2) LVITEM vItem; - про него совсем не понятно, что и как, потому что возвращающий длину в байтах этого типа
C
1
LVITEM vItem; // если вы так делаете значит у вас этот "LVITEM" где то есть.
3) vItem.pszText записать текст будем так считать.
C
1
vItem.pszText = void*((unsigned)vPointer + sizeof(LVITEM)); Как вариант
0
0 / 0 / 0
Регистрация: 02.12.2013
Сообщений: 11
18.08.2014, 08:31  [ТС]
Извините, забыл инициализацию. Воткнул в код С++.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
  HANDLE vPointer;
  HANDLE vProcess; 
  LVITEM vItem;
  DWORD vProcessId;
  GetWindowThreadProcessId(Wnd, &vProcessId);  // Wnd получен как параметр функции 
    vProcess = OpenProcess(PROCESS_VM_OPERATION || PROCESS_VM_READ || PROCESS_VM_WRITE,
        false, vProcessId);
  vPointer = VirtualAllocEx(vProcess, NULL, 4096, MEM_RESERVE || MEM_COMMIT, PAGE_READWRITE);
  vItem.pszText = LPWSTR(int(vPointer) + sizeof(LVITEM));
  wprintf(vItem.pszText); //вот тут вылетает ошибка
0
840 / 347 / 67
Регистрация: 20.11.2012
Сообщений: 809
18.08.2014, 15:08
C
1
2
3
vPointer = VirtualAllocEx(vProcess, NULL, 4096, MEM_RESERVE || MEM_COMMIT, PAGE_READWRITE);
  vItem.pszText = LPWSTR(int(vPointer) + sizeof(LVITEM));
  wprintf(vItem.pszText); //вот тут вылетает ошибка
То есть выделил память в чужом процессе, получил указатель, который действителен лишь в адресном пространстве того процесса и пытаешься его разыменовать в адресном пространстве своего?
ReadProcessMemory/WriteProcessMemory.

з.ы. Ну и в функциях для работы с памятью и процессами всегда нужно делать проверку результата. А то вдруг и память не выделилась?
И wprintf лучше использовать со строкой формата. А то вдруг в строке % попадется...

Ах да, еще и про разницу побитовых и логических операторов почитай (|| и | в частности).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.08.2014, 15:08
Помогаю со студенческими работами здесь

Переписать часть кода с Delphi на ассемблер (ассемблерные вставки в Delphi)
Добрый вечер. Нужно сделать ассемблерные вставки в программе. Первый раз столкнулся с таким заданием, в языке ассемблера почти ноль....

Можно ли переписать графическое WinAPI приложение в консольную программку?
Здрасте. Я новичок в WinApi, поэтому, сильно не обзывайте :) Пытаюсь тут переделать один опен сурс проект в его консольную версию (чтобы...

WINAPI and Delphi
Ребята,помогите пожалуйста с задачей по WINapi ....завтр над ее сдать...не сдам- прощай степендия(((...задача следующая: необходимо...

Можно ли сделать контроллер на манер фреймворков?
Можно ли сделать контроллер на манер фреймворков(laravel,yii2)? Просто пока кажется, что придётся все урл на компоненты завязывать. ...

Запись структуры в файл на манер делфей
На делфях есть замечательная возможность записывания всей структуры в файл одной строкой: Assignfile(file, '123.txt'); ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru