DLLDateien.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "DLLDateien.h"
  2. // Inhalt der DLLDateien Klasse aus DLLDateien.h
  3. // Konstruktor
  4. DLLDateien::DLLDateien() noexcept
  5. {
  6. try
  7. {
  8. dlls = new Array< DLLDatei* >();
  9. ref = 1;
  10. }
  11. catch( std::exception e )
  12. {
  13. }
  14. }
  15. // Destruktor
  16. DLLDateien::~DLLDateien()
  17. {
  18. cs.lock();
  19. int anz = dlls->getEintragAnzahl();
  20. for( int i = 0; i < anz; i++ )
  21. {
  22. DLLDatei *tmp = dlls->get( i );
  23. if( tmp )
  24. {
  25. tmp->name->release();
  26. FreeLibrary( tmp->handle );
  27. }
  28. delete tmp;
  29. }
  30. dlls->release();
  31. cs.unlock();
  32. }
  33. // nicht constant
  34. HINSTANCE DLLDateien::ladeDLL( char *name, char *pfad )
  35. {
  36. cs.lock();
  37. int anz = dlls->getEintragAnzahl();
  38. for( int i = 0; i < anz; i++ )
  39. {
  40. DLLDatei *tmp = dlls->get( i );
  41. if( tmp && tmp->name->istGleich( name ) )
  42. {
  43. tmp->ref++;
  44. cs.unlock();
  45. return tmp->handle;
  46. }
  47. }
  48. HINSTANCE h = LoadLibrary( pfad );
  49. if( !h )
  50. {
  51. cs.unlock();
  52. return 0;
  53. }
  54. DLLDatei *dll = new DLLDatei();
  55. dll->name = new Text( name );
  56. dll->handle = h;
  57. dll->ref = 1;
  58. dlls->add( dll );
  59. cs.unlock();
  60. return h;
  61. }
  62. void DLLDateien::releaseDLL( char *name )
  63. {
  64. cs.lock();
  65. int anz = dlls->getEintragAnzahl();
  66. for( int i = 0; i < anz; i++ )
  67. {
  68. DLLDatei *tmp = dlls->get( i );
  69. if( tmp && tmp->name->istGleich( name ) )
  70. {
  71. tmp->ref--;
  72. if( !tmp->ref )
  73. {
  74. tmp->name->release();
  75. //FreeLibrary( tmp->handle );
  76. delete tmp;
  77. dlls->remove( i );
  78. }
  79. cs.unlock();
  80. return;
  81. }
  82. }
  83. cs.unlock();
  84. }
  85. // Reference Counting
  86. DLLDateien *DLLDateien::getThis()
  87. {
  88. ref++;
  89. return this;
  90. }
  91. DLLDateien *DLLDateien::release()
  92. {
  93. ref--;
  94. if( !ref )
  95. delete this;
  96. return 0;
  97. }