DLLRegister.cpp 1.9 KB

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