Форум программистов, компьютерный форум CyberForum.ru

Реализация класса С++ (плагин) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не получается сделать калькулятор http://www.cyberforum.ru/cpp-beginners/thread1661272.html
Почему-то калькулятор не хочет работать как надо,со всеми функциями проблем нет кроме функции void getwrite(Clrk pp,Clrk ppp) компилятор предлагает прервать и ставит зелёную стрелку возле fractobj.getwrite(d1,dd1); Помогите пожалуйста! #include<iostream> #include<conio.h> using namespace std; struct Clrk { double chisl; double znam; };
C++ Доступ к приватному полю через адрес экземпляра объекта Объясните такой момент class A { private: char s; public: char Get(){ return s; } http://www.cyberforum.ru/cpp-beginners/thread1661221.html
C++ Подобрать тип данных для реализации метода Вонга
Какой тип данных или контейнера подойдет для составления этого алгоритма
Определить, может ли король попасть с первой заданной клетки на вторую одним ходом (шахматы) C++
Доброго времени суток. Начал интересоваться C++ и прохожу онлайн курс. Застопорился на условных операторах вот с такой задачей: Шахматный король ходит по горизонтали, вертикали и диагонали, но только на 1 клетку. Даны две различные клетки шахматной доски, определите, может ли король попасть с первой клетки на вторую одним ходом. Формат входных данных Программа получает на вход четыре числа...
C++ Непонятка с template: неоднозначный вызов перегруженной функции http://www.cyberforum.ru/cpp-beginners/thread1661176.html
В чем может быть проблема? Выдает следующее: error C2668: min: неоднозначный вызов перегруженной функции. Спасибо за помощь. template <class A> A min (A num1, A num2) { A Min = num1; if(Min >= num2) Min = num2; return Min;
C++ Создать базовый класс Car (машина) и производный класс Lorry (грузовик): ООП ошибки Создать базовый класс Car (машина), характеризуемый торговой маркой (строка), числом цилиндров, мощностью. Определить методы переназначения и изменения мощности. Создать производный класс Lorry (грузовик), характеризуемый также грузоподъемностью кузова. Определить функции переназначения марки и изменения грузоподьемности. ////////stdafx.h #pragma once #include "targetver.h" #include... подробнее

Показать сообщение отдельно
town
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 11

Реализация класса С++ (плагин) - C++

13.02.2016, 10:23. Просмотров 201. Ответов 2
Метки (Все метки)

Хорошего всем дня.
Столкнулся с проблемой:
Нужно написать плагин для существующей программы, исходного кода к ней нет.
Из программы идет вызов длл, которую я пробую реализовать.
Есть другой плагин, который ведет себя при вызове метода GetManager() таким образом(данные из отладчика):

Метод в существующей длл:
C++
1
2
3
4
5
6
7
8
9
__declspec(dllexport) struct CManager *__cdecl CManager::GetManager() //так его отладчик показывает
{
  if ( !(isObjectInited == 1) )
  {
    isObjectInited = 1;
    CManager::CManager((CManager *)&NewClassObject);
  }
  return (struct CManager *)&NewClassObject;
}
В самой программе идет вызов:
Я реализую этот метод в своей длл как:

C++
1
2
3
4
5
6
7
8
9
10
11
12
    __declspec(dllexport) static CManager&  GetManager(void)  (при этом имя после мангла совпадает с оригиналом)
    {
        static  CManager *myClass = NULL; 
 
        if (myClass == NULL)
        {
            myClass = new CManager(); 
            return *myClass;
        }
 
        return *myClass; 
    }
Далее в основном ехе идет вызов этой длл
//call ?GetManager@CManager@@SAAAV1@XZ ; CManager::Getanager(void)
и затем вызов:
//call ds:?GetAddressString@CManager@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ ; CManager::GetAddressString(void)

Я реализую метод как:
C++
1
2
3
4
5
6
__declspec(dllexport) string __thiscall CManager::GetAddressString(void)
    {
        string my;
        my = "Moscow, MCAD";
        return my;
    }
В оригинале и в моей длл все отрабывает отлично, получаю указатель на класс и вызывается метод нормально,
но в моем случае в ехе вызывается потом (вижу в отладчике)

C++
1
2
  if ( v36 >= 0x10 )
    operator delete(v34);
пытается освободить указатель
и на моем коде тут Exception

Bash
1
2
Debugged application message: Invalid address specified to RtlFreeHeap( 00950000, 001D5328 )
770B082C:  (exc.code 80000003, tid 10036)
При подключеии оригинальной длл - все ок, delete отрабатывает нормально.

Где можно порыться?
Спасибо.

Мой класс в длл реализован как:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
class  CManager
{
    MANAGER_DATA data;
    
private: 
    virtual ~CManager()
    {
    }
 
public:
    __declspec(dllexport)__thiscall CManager(void);
    __declspec(dllexport) static CManager&  GetManager(void); 
    __declspec(dllexport) std::string __thiscall CManager::GetAddressString(void);
}
Добавлено через 12 минут
Собственно, нужно понять как вызывается мой объект из основного exe:
Я пробую сделать свой тестовый exe:

CManager * myClass1 = new CManager();

CManager& class3 = myClass1->GetManager();
string Address=class3.GetAddressString();

И все отрабатывает нормально.

Может оригинальный ехе как-то по другому вызывает метод?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru