Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
town
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 11
1

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

13.02.2016, 10:23. Просмотров 228. Ответов 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();

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

Может оригинальный ехе как-то по другому вызывает метод?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2016, 10:23
Ответы с готовыми решениями:

Реализация класса на базе класса Stack с возможностью !индексирования!
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с...

реализация класса
Дано: класс "Фильмы" (название, жанр, главные роли). Вопрос: Возможно ли такой...

Реализация класса
Так как только начал изучать с++, возникает вопрос: есть задание :...

Реализация класса
Спроектировать и реализовать класс BigInt, позволяющий хранить целые числа в...

Реализация класса
Помогите понять пожалуйста. Пример из Дейтела: #include "stdafx.h" #include...

2
DrOffset
8142 / 4723 / 1154
Регистрация: 30.01.2014
Сообщений: 7,695
13.02.2016, 10:35 2
town, пока в качестче предположения.
Собираешь свою dll c /MD? Если да, то убедись (через dependency walker, например), что версия библиотеки времени исполнения с++ совпадает с той, которая требуется оригинальному приложению.
1
town
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 11
13.02.2016, 13:28  [ТС] 3
DrOffset,
Дружище, такие вещи, видимо, приходят только с опытом.
Спасибо, все заработало, собрал с правильной MSVCP/MSVCR и все получилось.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2016, 13:28

реализация класса строка
не могу понять как реализовать ... помогите вот там где "???????????" там...

Реализация абстрактного класса
Создать абстрактный базовый класс Function (функция) с виртуальными методами...

Реализация класса Цех
#include <iostream> #include <string.h> using namespace std; class CEH...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru