|
|
Знаете ли Вы, что ... | |
...нарушения правил форума наказываются. Старайтесь их не нарушать. | |
<< Предыдущий совет - Случайный совет - Следующий совет >> |
Другие языки программирования Здесь обсуждаются все, что касается JAVA, проблемы и задачи 1С, |
Ответить |
|
Опции темы | Опции просмотра |
07.07.2007 09:03 | #11 |
none
none
Сообщений: 51
+ 3
4/3
– 0
0/0
|
ВОТ ОНО! Сначала думал очередная лажа...не сработает всё из за того же CALLBACK....а оказалось достаточно только имени.
.а на счёт извращения.....другой способ ещё трудней: #pragma comment(linker,"/export:MyFunction=_MyFunction@4") //и так далее для всех функций...... //а это очень муторно,так как придётся искать в .lib файле //число байтов передпющихся в стек для каждой функции //а данном случае 4 байта.......... def файл намного красивее и легче ......всё!других способов нет ВСЕМ СПАСИБО! |
|
Ответить |
08.12.2009 18:50 | #12 | ||
Сисадмин
Самоучка
Сообщений: 161
+ 4
4/3
– 0
0/0
|
Судя с фото на орла не похож, больше на мелкую птицу
А если серёзно: //======= 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 |
Сисадмин
Самоучка
Сообщений: 161
+ 4
4/3
– 0
0/0
|
Привожу код для 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. |
|
Ответить |
|