Моё меню Общее меню Сообщество Правила форума Все прочитано
Вернуться   uForum.uz > ИКТ и телеком > IT-индустрия > Софт > Программирование > Другие языки программирования
Сообщения за день Поиск
Знаете ли Вы, что ...
...для каждой темы существует свой раздел. Изучите структуру форума. Если соответствующего раздела нет, то всегда есть раздел "Разное" :)
<< Предыдущий совет - Случайный совет - Следующий совет >>

Другие языки программирования Здесь обсуждаются все, что касается JAVA, проблемы и задачи 1С,


Ответить

 
Опции темы Опции просмотра
Старый 07.07.2007 09:03   #11  
Аватар для cascada
Оффлайн
none
none
Сообщений: 51
+ 3  4/3
– 0  0/0

Uzbekistan
ВОТ ОНО! Сначала думал очередная лажа...не сработает всё из за того же CALLBACK....а оказалось достаточно только имени.

.а на счёт извращения.....другой способ ещё трудней:

#pragma comment(linker,"/export:MyFunction=_MyFunction@4")
//и так далее для всех функций......
//а это очень муторно,так как придётся искать в .lib файле
//число байтов передпющихся в стек для каждой функции
//а данном случае 4 байта..........

def файл намного красивее и легче ......всё!других способов нет

ВСЕМ СПАСИБО!
Ответить 
Старый 08.12.2009 18:50   #12  
Аватар для nacgull
Оффлайн
Сисадмин
Самоучка
Сообщений: 161
+ 4  4/3
– 0  0/0

Ukraine
Talking

Цитата:
Сообщение от Aleksandr Vishinskiy Посмотреть сообщение
Я то может и орел
Судя с фото на орла не похож, больше на мелкую птицу
А если серёзно:
//======= EXPORT and IMPORT CLASS from/to DLL ===============
//-----------------30 october ...08 december 2009---------------
/*
.......Мне удалось, на мой взгляд, разработать методику простого ПОЛНОГО явного (динамического) импорта класса из DLL в клиентскую часть, т.е. в EXE или DLL . Во всяком случае для простого использования я уже применил её, далее планирую протестировать для разного использования классов по мере моего, более глубокого, изучения классов C++ и работы с ними.
.......Предлагаю оценить разработку.

Суть в следующем:
. 1.Экспортируем через extern "C"__declspec(dllexport), для каждого экспортного класса в DLL, специальную функцию импорта, тело функции (без определения в хедере) помещаем в кодовую часть исходника DLL сразу же за телами методов класса. Внутри тела функции создаем указатель на временный объект в "куче", возвращаем его через return в вызвавший эту функцию импортирующий клиент.
. 2.Hader DLL с определением экспортируемого класса включаем в исходник кода клиента (#include "DLLhader.h"). Загружаем в клиенте, как обычно при динамическом импорте, файл DLL через

. HMODULE lib = LoadLibrary("dllproject.dll");

Вызываем нашу специальную функцию импорта объекта, получаем указатель с адресом на место даных объекта, создаем новый указатель-объект нужного класса и присваиваем объекту адрес с возвращенного указателя. Обращаемся как обычно к переменным-членам этого объекта.
Все разрешенные переменные-члены этого класса уже у нас "в кармане".
. 3.В hader-е DLL, в определении экспортируемого класса, для каждого экспортируемого метода пишем определение переменной-члена - указателя на этот метод. Внутри тела нашей специальной функции импорта присваиваем адрес метода класса соответствующему указателю на метод класса как переменной.

. TempObjAdress->iMyMethod = &CMyClassB::MyMethod;

Теперь можно обращаться, после сделаного в п.2, к этой переменной и получать адрес кода нужного метода класса. Через него и вызываем метод - получаем "весь мир в кармане".

. (TestObject->*(TestObject.iMyMethod))(argX1, argX2, ... );

. 4.Остальные наработки упрощают получение кода импорта класса, для получения большого количества методов одного класса наиболее просто работать с макросами.
*/
__________________
Электроника БК-0010; Spectrum128"Scorpion256_ZS" :187:

Последний раз редактировалось nacgull; 08.12.2009 в 19:20.
Ответить 
Старый 08.12.2009 19:29   #13  
Аватар для nacgull
Оффлайн
Сисадмин
Самоучка
Сообщений: 161
+ 4  4/3
– 0  0/0

Ukraine
Привожу код для C++ Builder 2010
// dllmain.dll dllmain.cpp

//========= EXPORT and IMPORT CLASS from/to DLL ===========

#include <vcl.h>
#include <windows.h>

#pragma hdrstop

#include "dllmain.h"

#pragma argsused
//------------------------------------------------

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------
#define ExternDll extern "C" __declspec(dllexport)
#define ExportDll __declspec(dllexport)
//----------------------------------------------------------
CMyClassB::CMyClassB()
{
a = 1.0f;
b = 1700;
}
int CMyClassB::MySumB(int Period)
{
//помещаем файл "A.wav" в папку "Debug" этого проекта С++
PlaySound("A.wav", 0, SND_FILENAME);
Beep(1500,Period);
Beep(Period,500);
return (int)(a+b);
}
int CMyClassB::MySumB2(int Ton)
{
//помещаем файл "Walk-Talk.wav" в папку "Debug" этого проекта С++
PlaySound("Walk-Talk.wav", 0, SND_FILENAME);
Beep(b,300);
Beep(Ton,b);
return (int)(a+b);
}
//////////////////////////////


ExternDll CMyClassB* CMyClassB_(int InitImport)
{
CMyClassB* TempObjAdress = new CMyClassB;
// int s = (DataObjAdress->*(DataObjAdress->iMySumB))(100); s = s + s;

if (InitImport)
{
TempObjAdress->iMySumB = &CMyClassB::MySumB;
TempObjAdress->iMySumB2 = &CMyClassB::MySumB2;
}
// DataObjAdress->iMySumB2 = DataObjAdress->iMySumB;
return TempObjAdress;
}

//=================================================
// dllmain.dll dllmainH.h

#include <mmsystem.hpp> // for func: PlaySound("FileName", 0, SND_FILENAME);
//////////////////////////////////////////////////////////////////////////

#define DLL_METHOD_2(Object_Name, Class_Pointer, Method, Return_Type_Arg, Class_Type, Type_Arg1 ) \
Return_Type_Arg ( Class_Type ::*Method)( Type_Arg1, Type_Arg2 ) \
= Object_Name Class_Pointer i ## Method

//////////////////////

#define DLL_METHOD_01(Object_Name, Class_Pointer, Method, Return_Type_Arg, Class_Type, Type_Arg1 ) \
Return_Type_Arg ( Class_Type ::*Method)( Type_Arg1 ) \
= Object_Name Class_Pointer i ## Method

///////////////////////////////////////////////////////////////////////////
class CMyClassB
{
CMyClassB_Types
public:
CMyClassB();
//DLL Method Export-Import
void (CMyClassB::*iCMyClassB)();

int MySumB(int);
//DLL Method Export-Import
int (CMyClassB::*iMySumB)(int);

int MySumB2(int);
//DLL Method Export
int_CMyClassB_int iMySumB2;

float a;
int b;
private:
int x;
};
// Import Pointers
/////////////////////////////
#define DLL_METHODS_CMyClassB( Object_Name, Class_Pointer ) \
/* NameFuncCreateObject Class_Type_ Class_Type_Ptr */ \
/* TypePointer & * */ \
/* Class_Pointer . -> */ \
DLL_METHOD_01( Object_Name, Class_Pointer, MySumB, int, CMyClassB, int ) ; \
DLL_METHOD_01( Object_Name, Class_Pointer, MySumB2, int, CMyClassB, int ) ; \
//DLL_METHOD_01( Object_Name, Class_Pointer, CMyClassB, void, CMyClassB, ) ;


//---------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////

#define DLL_IMPORT_CLASS( Library_Name, Class_Type) \
/* NameFuncCreateObject Class_Type_ Class_Type_Ptr */ \
/* TypePointer & * */ \
/* Class_Pointer . -> */ \
Class_Type & (* Class_Type ## _ )(int) ; \
Class_Type ## _ = ( Class_Type & (*)(int))GetProcAddress(Library_Name, "_" #Class_Type "_" ); \
\
\
Class_Type * (* Class_Type ## _ ## Ptr )(int) ; \
Class_Type ## _ ## Ptr = ( Class_Type * (*)(int))GetProcAddress(Library_Name, "_" #Class_Type "_" ); \

///////////////////////////////////

#define DLL_CREATE_DATABLOCK( Class_Type, Object_Name ) \
Class_Type & Object_Name = Class_Type ## _ ## (0) ; /* 0 ~ без инициализации указателей на методы класса */

#define DLL_CREATE_POINTER( Class_Type, Object_Name ) \
Class_Type * Object_Name = Class_Type ## _ ## Ptr ## (0) ; /* 0 ~ без инициализации указателей на методы класса */

////////////////////////////////////

#define DLL_IMPORT_DATABLOCK( Library_Name, Class_Type, Object_Name) \
DLL_IMPORT_CLASS( Library_Name, Class_Type) ; \
Class_Type & Object_Name = Class_Type ## _ ## (1) ; /* 1 ~ инициализация указателей на методы класса */ \
DLL_METHODS_ ## Class_Type ## ( Object_Name, . )

#define DLL_IMPORT_POINTER( Library_Name, Class_Type, Object_Name) \
DLL_IMPORT_CLASS( Library_Name, Class_Type) ; \
Class_Type * Object_Name = Class_Type ## _ ## Ptr ## (1) ; /* 1 ~ инициализация указателей на методы класса */ \
DLL_METHODS_ ## Class_Type ## ( Object_Name, -> )

//=================================================
// appmain.exe Unit1H.cpp
#include <vcl.h>
#include <stdio.h>
#include <conio.h>

#pragma hdrstop

#include "dllmain.h"
#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//на форме в закладе Design делаем кнопку Button, двойной клик на неё - переходим в кодовую часть
void __fastcall TForm1::Button10Click(TObject *Sender)
{
// III CMyClass& Test = GetClassImportAdressAndPointer(lib,"_MyClassExport ");
HMODULE lib = LoadLibrary("dllproject.dll");
//////////////////////////
// CMyClassB* Test = ((CMyClassB* (*)())GetProcAddress(lib, "_CMyClassB_"))();
// int (CMyClassB::*MySumB2)(int) = Test->iMySumB2;


DLL_IMPORT_POINTER( lib, CMyClassB, Test) ; //DLL_IMPORT_POINTER( Library_Name, Class_Type, Object_Name)

(Test->*MySumB2)(700);

// Test->a = Test->a + Test->b;
Test->b = 250;
///////////////////////////
DLL_CREATE_POINTER( CMyClassB, Test1 ) ; //DLL_CREATE_POINTER( Class_Type, Object_Name )
(Test1->*MySumB2)(400);
Test1->b = 450;


DLL_CREATE_DATABLOCK( CMyClassB, Test2 ) //
(Test2.*MySumB2)(400);
Test2.b = 450;
//////////////////////////////////////////
CMyClassB& Mest = ((CMyClassB& (*)())GetProcAddress(lib, "_CMyClassB_"))();

//CMyClassB& Mest = CMyClassB_();

// int (CMyClassB::*MMySumB2)(int) = Mest->iMySumB2;

(Mest.*MySumB2)(500);
(Test->*MySumB2)(700);
Mest.a = Mest.a + Mest.b;
//delete[] &Test;

FreeLibrary(lib);
lib = NULL;
}

//===============================================
// appmain.exe Unit1H.h
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
. . .
__________________
Электроника БК-0010; Spectrum128"Scorpion256_ZS" :187:

Последний раз редактировалось nacgull; 08.12.2009 в 19:59.
Ответить 
Ответить




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Advertisement System V2.5 By Branden
OOO «Единый интегратор UZINFOCOM»


Новые 24 часа Кто на форуме Новички Поиск Кабинет Все прочитано Вверх