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

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

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

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

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

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

Может оригинальный ехе как-то по другому вызывает метод?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2016, 10:23     Реализация класса С++ (плагин)
Посмотрите здесь:

Реализация класса Directory - C++
Информационная запись о файле в каталоге содержит поля: имя файла, расширение, дата и время создания, атрибуты "только чтение", "скрытый",...

Реализация шаблона класса - C++
Большая-пребольшая просьба, помогите, пожалуйста, с решением данной задачи. Саму задачу реализовать не сложно, но вот с использованием...

Реализация класса и вектор - C++
Всем привет! test.cpp(главный файл) /* * @pay - зарплата сотрудника * @countEl - позиция элемента в контейнере */ #include...

Реализация класса множества - C++
Реализую класс множества. Некорректно работает удаление элемента из множества. Прошу помощи // Ðåàëèçàöèÿ êëàññà ìíîæåñòâà #include...

Реализация класса матрица - C++
День добрый форум! Хочу узнать ваше мнение по поводу того, как лучше реализовать класс матриц. Какую структуру лучше выбрать?...

Реализация конструктора класса - C++
Здравствуйте! Хотел задать такой вопрос: Предположим, имеется класс: class Object { private: int itsVal1; int...

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

Реализация класса Цех - C++
#include <iostream> #include <string.h> using namespace std; class CEH { private: char imya ; char nachalnik...

Реализация класса контейнер. - C++
Естественно, это нужно сделать без использования подключаемых библиотек. Описать шаблон-класс нужно сначало. И затем программу, которая...

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


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6913 / 4106 / 936
Регистрация: 30.01.2014
Сообщений: 6,904
13.02.2016, 10:35     Реализация класса С++ (плагин) #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
town, пока в качестче предположения.
Собираешь свою dll c /MD? Если да, то убедись (через dependency walker, например), что версия библиотеки времени исполнения с++ совпадает с той, которая требуется оригинальному приложению.
town
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 11
13.02.2016, 13:28  [ТС]     Реализация класса С++ (плагин) #3
DrOffset,
Дружище, такие вещи, видимо, приходят только с опытом.
Спасибо, все заработало, собрал с правильной MSVCP/MSVCR и все получилось.
Yandex
Объявления
13.02.2016, 13:28     Реализация класса С++ (плагин)
Ответ Создать тему
Опции темы

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