Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows
Перезагрузить страницу Использование чужой dll(без исходника dll)
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ByMsx ByMsx вне форума
Новичок
 
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.08.2013
Question Использование чужой dll(без исходника dll) - 30.08.2013, 18:29

Всем доброго времени суток! Чтобы не происходило позже проблем по ходу решения вопроса, расскажу всё сразу. Значит, я решил создать мультиплеер для одной игры. При запуске она использует кучу dll'ok. Одна из таких pdd.dll. Я решил написать мультиплеер, который будет загружать все дллки, вместо запускающего файла и вызывать из дллок только нужные функции. Dependency Walker'om удалось выдрать список классов, а также их полей и методов. Но... Тут возник ряд проблем:
1) Когда использую LoadLibrary(Win API) библиотека начинает выполнятся, это мне не нужно.
2) Также я не могу(по логике) вызвать ни один метод, т.к. таблица адресов не заполнена.
3) Также я посмотрел в интернете несколько статей на эту тему и всё равно не понял, как вызывать методы и создавать экземпляр класса.

Из исходников, которые смог, так сказать, наклепать:

dll.h
cpp Код:
#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>
#include <stdlib.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */


#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif


#ifdef __cplusplus
extern "C"
{
#endif

class DLL_EXPORT CarProperty
{

};

class DLL_EXPORT Car
{

};

class DLL_EXPORT CarManager
{
    public:
//        const 'vtfable';
        CarManager(void);
        ~CarManager(void);
        void Close(void);
        void Open(void);
        void AttachCar2Scene(class Car * par1);
        class CarProperty * GetCarProperty(class nString const & par1);
        class Car * CreateCar(struct CarDesc const & par1, bool par2);
        void DestroyAllCars(void);
        void DestroyCar(class nString const & par1);
        void DestroyCar(class Car * par1);
        void FireChangePassengers(class Car * par1);
        int GetCarCount(void);
        int GetCarIndex(class nString const & par1);
        class PassengerBase * GetPassengerBase(void);
        class Car * GetPlayerCar(void);
        class Car * GetPlayerCar(int par1);
        int GetPlayerCarCount(void);
        bool IsOpen(void);
        class CarProperty * LoadCarProperty(class nString const & par1);
        void ReloadCarProperties(void);
        void Render(void);
        void RestoreVisibilites(void);
        void SaveVisibilites(void);
        void SetVisibleAllCars(bool par1,bool par2);
        void UnregisterChangePassengersListener(class CarManager::IChangePassengers * par1);
        void _DestroyCar(class std::_Vector_iterator<class Car *,class std::allocator<class Car *> >par1,bool par2);
        struct Physics::SCustomSettings * getCustomSettings(bool par1);
        bool isParkingRequested(void);
        class CarManager * mSingleton;
        void onFrame(void);
        void proceedParkingCars(void);
        void releaseLicensePlate(struct LicenseInfo const & par1);
        void releaseLicensePlate(class LicensePlateRenderer::Graphics * par1);
        void releaseParkingCarsData(void);
        void setParkingCarData(class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >par1,struct ParkingCarData par2,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >par3,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const,struct CarManager::ParkingCarData> > > const & par4);
        void setParkingRequested(void);
};

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp
cpp Код:
#include <iostream>
#include <stdlib.h>
#include "dll.h"
#include <windows.h>

using namespace std;

int main()
{
    HMODULE hLib;
    hLib = LoadLibrary("PDD.dll");
    void (CarManager::*pConstructor)();
    (FARPROC &)pConstructor = GetProcAddress(hLib, "CarManager");
    char _c[sizeof(CarManager)];
    CarManager &c = *(CarManager *)_c;
    (c.*pConstructor)();
    void(CarManager::*GetPlayerCar)();
    (FARPROC &)GetPlayerCar = GetProcAddress(hLib, "CarManager::GetPlayerCar");
    (c.*GetPlayerCar));
    return 0;
}

Заранее спасибо!
Ответить с цитированием
  (#2 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,399
Сказал(а) спасибо: 22
Поблагодарили 937 раз(а) в 921 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 30.08.2013, 20:11

Привет.
Это далеко от моей области интересов.

1. Вы всё равно вызываете LoadLibrary в своём примере.
2. Каждый метод класса подразумевает неявную передачу указателя this на объект класса. Так что вызывать методы напрямую в основном бессмысленно, проще создать объект.
3. Пример: Using classes exported from a DLL using LoadLibrary.
Ответить с цитированием
Ads
Ответ

Метки
c++ , dll , адреса , классы

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как грамотно читать чужой код? tiger() Технологии программирования 0 19.12.2012 07:25
Win7 и ЧУЖОЙ хард Opex Windows 7 5 20.06.2012 22:23
Как сделать компиляцию c++ исходника под linux yarick27 С/С++ 6 11.02.2010 20:18
Чужой жесткий диск на свой пк BVC Накопители 7 24.02.2008 08:20
Извлечение патча из исходника Beket Visual C++ 5 09.12.2007 00:01
Вывод исходника! Turbovladik Pascal 15 24.04.2006 17:54
Компилирование исходника программы на Delphi imported_Flanker Вопросы начинающих программистов 4 06.02.2006 14:37
Минимизация чужой программы WolfEinstein Delphi 3 18.08.2005 16:43
Чужой код как в нем разобраться Diver Общие вопросы создания ПО 2 06.04.2005 21:26
Сбой Visual C++ .NET 2003 при попытке сохранить файл исходника __sanya__ Visual C++ 6 08.08.2004 21:54
Написание исходника коммивояжера на паскале Anonymous Вопросы начинающих программистов 0 28.04.2004 01:35
Как из исходника убрать неиспользуемые переменные north_crow C++ Builder 2 06.05.2003 20:44



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов