Форум программистов, компьютерный форум 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; };
Теория и практика программирования Применение рефакторинга для увеличения тестируемости кода Мои цели: 1) Высокая читаемость кода 2) Легкость тестирования кода (юнит тесты, интеграционные тесты, приемочные тесты) 3) Высокая модульность кода 4) Возможность повторного использования кода Конкретная задача (может быть использована для людей, которые предпочитают показывать на примере): Необходимо скопировать набор файлов из одной папки в другую. На этапе компиляции известны: Имена... http://www.cyberforum.ru/cpp-beginners/thread1661269.html
Доступ к приватному полю через адрес экземпляра объекта C++
Объясните такой момент class A { private: char s; public: char Get(){ return s; }
C++ Подобрать тип данных для реализации метода Вонга
Какой тип данных или контейнера подойдет для составления этого алгоритма
C++ Определить, может ли король попасть с первой заданной клетки на вторую одним ходом (шахматы) http://www.cyberforum.ru/cpp-beginners/thread1661203.html
Доброго времени суток. Начал интересоваться C++ и прохожу онлайн курс. Застопорился на условных операторах вот с такой задачей: Шахматный король ходит по горизонтали, вертикали и диагонали, но только на 1 клетку. Даны две различные клетки шахматной доски, определите, может ли король попасть с первой клетки на вторую одним ходом. Формат входных данных Программа получает на вход четыре числа...
C++ Непонятка с template: неоднозначный вызов перегруженной функции В чем может быть проблема? Выдает следующее: error C2668: min: неоднозначный вызов перегруженной функции. Спасибо за помощь. template <class A> A min (A num1, A num2) { A Min = num1; if(Min >= num2) Min = num2; return Min; подробнее

Показать сообщение отдельно
town
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 11
13.02.2016, 10:23     Реализация класса С++ (плагин)
Хорошего всем дня.
Столкнулся с проблемой:
Нужно написать плагин для существующей программы, исходного кода к ней нет.
Из программы идет вызов длл, которую я пробую реализовать.
Есть другой плагин, который ведет себя при вызове метода 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();

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

Может оригинальный ехе как-то по другому вызывает метод?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 18:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru