Guest User

Untitled

a guest
Oct 20th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. //================================================================
  2. // Это код C++ Builder
  3. //================================================================
  4. #include <vcl.h>
  5. #pragma hdrstop
  6. #include "Unit1.h"
  7. #pragma package(smart_init)
  8. #pragma resource "*.dfm"
  9.  
  10. // Функции которые будут импортированы из wrapper
  11. // Параметр не важен
  12. typedef int (*init_mylib_t)( unsigned int hwnd_address );
  13. typedef int (*shutdown_mylib_t)();
  14.  
  15. struct Wrapper{
  16. Wrapper():
  17. m_lib( 0 ),
  18. m_init_mylib_f( 0 ),
  19. m_shutdown_mylib_f( 0 )
  20. {}
  21.  
  22. ~Wrapper(){
  23. if( m_lib ){
  24. FreeLibrary( m_lib );
  25. }
  26. }
  27.  
  28. HMODULE m_lib;
  29. init_mylib_t m_init_mylib_f;
  30. shutdown_mylib_t m_shutdown_mylib_f;
  31. };
  32.  
  33. //Так я избавился от использования глобальной переменной Wrapper
  34. //может можно как проще, незнаю, но вопрос не в этом
  35. unsigned long long & __getWrapper(){
  36. static unsigned long long address = 0u;
  37. return address;
  38. }
  39.  
  40. Wrapper* getWrapper(){
  41. return (Wrapper*)__getWrapper();
  42. }
  43.  
  44. void setWrapper( Wrapper * wrapper ){
  45. __getWrapper() = (unsigned long long)((void*)wrapper);
  46. }
  47.  
  48. //Загрузка враппера, получение адресов и запуск библиотеки
  49. void init_wrapper( unsigned int button_hwnd ){
  50. Wrapper* wrapper = new Wrapper;
  51. setWrapper( wrapper );
  52.  
  53. wrapper->m_lib = LoadLibrary( L"wrapper.dll" );
  54. if( !wrapper->m_lib ){
  55. throw Exception("Can not load wrapper.dll");
  56. }
  57.  
  58. wrapper->m_init_mylib_f = (init_mylib_t)GetProcAddress( wrapper->m_lib, "init_mylib" );
  59. if( !wrapper->m_init_mylib_f ){
  60. throw Exception("Can not get procedure address [init_mylib] from wrapper.dll");
  61. }
  62.  
  63. wrapper->m_shutdown_mylib_f = (shutdown_mylib_t)GetProcAddress( wrapper->m_lib, "shutdown_mylib" );
  64. if( !wrapper->m_shutdown_mylib_f ){
  65. throw Exception("Can not get procedure address [shutdown_mylib] from wrapper.dll");
  66. }
  67. //запуск библиотеки
  68. if( !wrapper->m_init_mylib_f( button_hwnd ) ){
  69. throw Exception("Can not init mylib");
  70. }
  71. }
  72.  
  73. TForm1 *Form1;
  74. __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}
  75. void __fastcall TForm1::FormDestroy(TObject *Sender){
  76. shutdown_wrapper();
  77. }
  78. void __fastcall TForm1::FormCreate(TObject *Sender){
  79. init_wrapper( (unsigned int)Button1->Handle );
  80. }
  81.  
  82. extern "C"{
  83.  
  84. MYLIB_API int init_mylib( unsigned int hwnd_address ){
  85. auto wrapper = getWrapper();
  86.  
  87. //выполняя этот метод, wrapper.dll вызывает mylib.dll
  88. //при инициализации mylib.dll программа перестаёт работать
  89. // hwnd_address равен 0
  90. if( !wrapper->init( hwnd_address ) ) return 0;
  91.  
  92. return 1;
  93. }
  94.  
  95. MYLIB_API int shutdown_mylib(){
  96. return 1;
  97. }
  98. }
Add Comment
Please, Sign In to add comment