Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75

Обработка события внешней программы

17.04.2015, 12:04. Показов 2534. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем,

Пытаюсь написать плагин на C++ для приложения KD. Данное приложение взаимодействует с библиотекой написанной на VB6, или скриптами JS либо VBSript, предварительно подключенные в файле конфигурации "INI". Если просто создать метод:
C++
1
2
3
4
5
6
7
8
bool OnAppQuitAfter(int CallParamBlock)
{
    if (CallParamBlock > 0)
    {
        MessageBoxA(NULL, "Hello!", "Title Box", MB_OK);
    }
    return 1;
}
то на выгоде ничего. Если использовать метод для взаимодействия с приложением VB6, то диалог с сообщением появляется после вызова события OnAppQuitAfter, но затем программа завершается с ошибкой.

Пример кода для VB6:
Header.h
C++
1
2
3
4
5
6
#include <cstdio>
#include <Windows.h>
 
using namespace std;
 
#define EXPORT extern "C" __declspec (dllexport)
Source.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Header.h"
#include <stdlib.h>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
EXPORT bool OnAppQuitAfter(int CallParamBlock)
{
    if (CallParamBlock > 0)
    {
        MessageBoxA(NULL, "Hello!", "Title Box", MB_OK);
    }
    return 1;
}
У меня есть подозрение, что ошибка вызвана неверным подходом к обработке события. Любые идей приветствуются.
Спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2015, 12:04
Ответы с готовыми решениями:

Как из программы добавить переменные при вызове внешней программы через system?
В разрабатываемой программе имеются готовые переменные path и аргумент argv возвращающий название файла. Я хочу вызвать на исполнение...

Запуск внешней программы
В программе создается некое изображение, которое потом нужно открыть внешней программой. Но до для начала хотелось бы понять как просто...

Скрытый запуск внешней программы
Здравствуйте, товарищи! Подскажите, можно ли запустить как-то чужую программу в скрытом режиме (в Windows)? Я запускаю программу...

35
Заблокирован
17.04.2015, 12:50
C++
1
OnAppQuitAfter
Это чё? Кто эту функцию "дёргает"? Основной софт? В какой момент времени он её вызывает?
Что ты вообще хочешь сделать? Показать диалоговое окно перед выходом?
Это функция вызывается асинхронно от основного софта?
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 13:16  [ТС]
OnAppQuitAfter - это событие, точнее таким образом метод взаимодействует с программой на событие, возникающее на момент закрытия программы. В JS скрипте все просто, достаточно вызвать функцию:
JavaScript
1
2
3
4
5
6
7
8
function OnAppQuitAfter(CallParamBlock)
{
    if (CallParamBlock > 0)
    {
        // ..
    }
    return 1;
}
но как это сделать в C++, это меня озадачило...
0
Заблокирован
17.04.2015, 13:40
Цитата Сообщение от Vite Посмотреть сообщение
но как это сделать в C++, это меня озадачило...
Что тебя озадачило? Что ты сделать хочешь?
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 13:56  [ТС]
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Что тебя озадачило? Что ты сделать хочешь?
Почему программа KD завершается с ошибкой?
0
Заблокирован
17.04.2015, 14:01
Цитата Сообщение от Vite Посмотреть сообщение
Почему программа KD завершается с ошибкой?
С какой ошибкой?
Ты деббагером полови, после чего ошибка вылетает. Поставь брейкпоинт на if (CallParamBlock > 0) и скачи дальше ... Надо выяснить, что вызывает ошибку
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 14:14  [ТС]
отладчик останавливается на адресе: 0018D31F add byte ptr [edi+7C0066CAh],dh
0
Заблокирован
17.04.2015, 14:19
Цитата Сообщение от Vite Посмотреть сообщение
отладчик останавливается на адресе: 0018D31F
Слушай, ну ты что реально прикалываешься? Что мне даст адрес процедуры хост софта твоего плагина в виртуальном пространстве на твоей ОС на твоём компе
C++
1
2
3
4
5
6
7
8
EXPORT bool OnAppQuitAfter(int CallParamBlock)
{
    if (CallParamBlock > 0) // <<<<<------ВОТ ТУТ ПОСТАВЬ БРЕЙК ПОИНТ!!!!!!!!!! 
    {
        MessageBoxA(NULL, "Hello!", "Title Box", MB_OK);
    }
    return 1;
}
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 14:23  [ТС]
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Слушай, ну ты что реально прикалываешься?
Может я не правильно настроил проект?
0
Заблокирован
17.04.2015, 14:27
Цитата Сообщение от Vite Посмотреть сообщение
Может я не правильно настроил проект?
да причём тут эти настройки ...

Ты можешь сделать то, что я тебе сказал? Поставить брейкпоинт на строчку, как туда программа зайдёт = жми F10 чтоб шагнуть дальше, потом ещё дальше и увидишь, после чего вылетает ошибка ...
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 14:40  [ТС]
все я настроил, нужно было указать путь в "General / Output Directory"...я так и сделал, поставил брейк на условие, в самом плагине нет проблем, он проходит полностью и выводит диалог, ошибка возникает в DV.DLL самого приложения KD...
0
Заблокирован
17.04.2015, 15:02
Цитата Сообщение от Vite Посмотреть сообщение
ошибка возникает в DV.DLL самого приложения KD...
А если без твоего плагина, то ошибка не возникает? Если да, то тут может быть не толкьо косяк на стороне разработчика KD, но и на тебе. Смотря что ты делаешь в своём плагине
А вообще конечно поражает не умение 99% задающих тут вопросы пользоваться отладчиком, ведь 99% вопросов можно было бы решить самому за секунду. Ну конечно я не считаю вопросов халявщиков аля "нужно решить... составить блок схему.... препод задал .... " .
Для новичков - https://www.cyberforum.ru/cpp-... 62479.html
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 15:18  [ТС]
я же написал, что ничего не делаю, пока только отлаживаю...в приложении нет ошибки, потому как скрипт JS без проблем выполняется, проблема возникает с плагином, компилированном на C++...я полагаю, возможно это связано с конфликтом экспортируемой функции, на уровне приложения KD...если бы я вызывал функцию из внешнего приложения, то возможно ошибки не было, а тут получается возникает событие...

Добавлено через 6 минут
вот что я получаю в Output:

First-chance exception at 0x0018D31F in kd_app.exe: 0xC0000005: Access violation writing location 0x7C19670E.
Unhandled exception at 0x0018D31F in kd_app.exe: 0xC000041D: Во время обратного вызова пользователя обнаружено необработанное исключение.
0
Заблокирован
17.04.2015, 15:32
Я что то не пойму, ты ещё не разобрался с проблемой что ли?

Если так - показывай код всего плагина
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 15:36  [ТС]
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Если так - показывай код всего плагина
весь код в самом начале...
0
Заблокирован
17.04.2015, 15:40
Цитата Сообщение от Vite Посмотреть сообщение
весь код в самом начале...


Ну если это весь код и:
1. При проходе отладчиком по этому коду ошибок нет
2. Без этого плагина твоя главная программа работает
3. С плагином программа вылетает после прохода данного кода плагина

то тут можно единственное что предложить, это попробовать вернуть true/ false из OnAppQuitAfter
Может там нужно что то определённое возвращать, а ты всё время 1 хреначишь. Попробуй false.

Если дело не в этом - косяк самого головного софта.
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 15:46  [ТС]
Вот документация SDK: https://www.dropbox.com/s/g53w... U.doc?dl=0

Добавлено через 4 минуты
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Может там нужно что то определённое возвращать, а ты всё время 1 хреначишь. Попробуй false.
Пробовал, та же фигня...
0
Заблокирован
17.04.2015, 15:53
Я чё то не понял, ты мне наврал что ли? Ты отладчиком не пробегал по своему плагину? Вухаха

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "Header.h"
#include <stdlib.h>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
EXPORT bool OnAppQuitAfter(int CallParamBlock)
{
    if (CallParamBlock > 0)
    {
        MessageBoxA(NULL, "Hello!", "Title Box", MB_OK);
    }
    return 1;
}
Это код чего? CPP файла? Проект какого типа? DLL?
0
2 / 2 / 3
Регистрация: 02.12.2014
Сообщений: 75
17.04.2015, 16:16  [ТС]
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Это код чего? CPP файла? Проект какого типа? DLL?
я создал реозиторий: https://github.com/INTITY/KDE
0
Заблокирован
17.04.2015, 16:40
О.. ну там вообще бред какой то в коде.
Поищи по интернете примеры плагинов для твоего софта и посмотри что да как.
У тебя там реально бред.

Добавлено через 1 минуту
для чего ты используешь функцию LoadLibrary может рассказать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2015, 16:40
Помогаю со студенческими работами здесь

Запуск внешней программы перед компиляцией
Задача следующая: Есть код типа: #define SITUATION(N, description) {return N;} void (SomeFunc(){ if (/*some_condition*/...

Не ждать завершения запущенной внешней программы
Я запускаю из своей программы внешний экзешник при помощи system(command). Но данный вариант меня не устраивает, т.к. приходится ждать...

События и их обработка
Подскажите как можно реализовать обработку событий, чтобы можно было использовать примерно такой код: void test_handler(object*...

Обработка события старт программы
Как добиться, чтобы определенный код выполнялся при запуске программы

Autorun программы, обработка события блокировки\разблокировки экрана
Здравствуйте. Заранее хочу сказать, что на Гугл потратил 3 дня, задал вопрос на stackoverflow, но ни кто так и не ответил. Последняя...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru