Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //================================================================
- // Это код C++ Builder
- //================================================================
- #include <vcl.h>
- #pragma hdrstop
- #include "Unit1.h"
- #pragma package(smart_init)
- #pragma resource "*.dfm"
- // Функции которые будут импортированы из wrapper
- // Параметр не важен
- typedef int (*init_mylib_t)( unsigned int hwnd_address );
- typedef int (*shutdown_mylib_t)();
- struct Wrapper{
- Wrapper():
- m_lib( 0 ),
- m_init_mylib_f( 0 ),
- m_shutdown_mylib_f( 0 )
- {}
- ~Wrapper(){
- if( m_lib ){
- FreeLibrary( m_lib );
- }
- }
- HMODULE m_lib;
- init_mylib_t m_init_mylib_f;
- shutdown_mylib_t m_shutdown_mylib_f;
- };
- //Так я избавился от использования глобальной переменной Wrapper
- //может можно как проще, незнаю, но вопрос не в этом
- unsigned long long & __getWrapper(){
- static unsigned long long address = 0u;
- return address;
- }
- Wrapper* getWrapper(){
- return (Wrapper*)__getWrapper();
- }
- void setWrapper( Wrapper * wrapper ){
- __getWrapper() = (unsigned long long)((void*)wrapper);
- }
- //Загрузка враппера, получение адресов и запуск библиотеки
- void init_wrapper( unsigned int button_hwnd ){
- Wrapper* wrapper = new Wrapper;
- setWrapper( wrapper );
- wrapper->m_lib = LoadLibrary( L"wrapper.dll" );
- if( !wrapper->m_lib ){
- throw Exception("Can not load wrapper.dll");
- }
- wrapper->m_init_mylib_f = (init_mylib_t)GetProcAddress( wrapper->m_lib, "init_mylib" );
- if( !wrapper->m_init_mylib_f ){
- throw Exception("Can not get procedure address [init_mylib] from wrapper.dll");
- }
- wrapper->m_shutdown_mylib_f = (shutdown_mylib_t)GetProcAddress( wrapper->m_lib, "shutdown_mylib" );
- if( !wrapper->m_shutdown_mylib_f ){
- throw Exception("Can not get procedure address [shutdown_mylib] from wrapper.dll");
- }
- //запуск библиотеки
- if( !wrapper->m_init_mylib_f( button_hwnd ) ){
- throw Exception("Can not init mylib");
- }
- }
- TForm1 *Form1;
- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}
- void __fastcall TForm1::FormDestroy(TObject *Sender){
- shutdown_wrapper();
- }
- void __fastcall TForm1::FormCreate(TObject *Sender){
- init_wrapper( (unsigned int)Button1->Handle );
- }
- extern "C"{
- MYLIB_API int init_mylib( unsigned int hwnd_address ){
- auto wrapper = getWrapper();
- //выполняя этот метод, wrapper.dll вызывает mylib.dll
- //при инициализации mylib.dll программа перестаёт работать
- // hwnd_address равен 0
- if( !wrapper->init( hwnd_address ) ) return 0;
- return 1;
- }
- MYLIB_API int shutdown_mylib(){
- return 1;
- }
- }
Add Comment
Please, Sign In to add comment