Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
town
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 11
#1

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

13.02.2016, 10:23. Просмотров 218. Ответов 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
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2016, 10:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Реализация класса С++ (плагин) (C++):

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

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

Реализация класса - C++
Помогите понять пожалуйста. Пример из Дейтела: #include "stdafx.h" #include <iostream> #include "GradeBook.h" using namespace...

реализация класса - C++
Дано: класс "Фильмы" (название, жанр, главные роли). Вопрос: Возможно ли такой подход к реализации? class films { string...

Реализация класса - C++
Так как только начал изучать с++, возникает вопрос: есть задание : Реализовать класс IntArray. Разработать тестовую программу для...

Проектирование и реализация класса - C++
Кто знает как написать программу на тему микроволновая печь скажите плиз!!!! Микроволновая печь Свойства: • состояние (вкл. /...

2
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
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
Привет! Вот еще темы с ответами:

Реализация шаблонного класса - C++
List_Node.h: #ifndef _List_Node_H #define _List_Node_H template <class Type> class ListNode { public: Type...

Реализация класса стэк - C++
Необходимо реализовать методы класса СТЭК. Все методы должны возвращать true в случае удачного завершения и false в противном случае.

Определение и реализация класса. - C++
Есть два кода: 1) Объявление класса #include <winioctl.h> #define FILE_DEVICE_WINIO 0x00008010 #define WINIO_IOCTL_INDEX...

Реализация класса Vector - C++
Добрый день всем! Пишу реализацию класса vector, но не могу разобраться, как написать ручные push_back и pop_back, может у кого есть...


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

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

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