DLLRegister.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. FreeLibrary( tmp->handle );
  22. }
  23. delete tmp;
  24. }
  25. dlls->release();
  26. cs.unlock();
  27. }
  28. // nicht constant
  29. HINSTANCE DLLRegister::ladeDLL( char *name, char *pfad )
  30. {
  31. cs.lock();
  32. int anz = dlls->getEintragAnzahl();
  33. for( int i = 0; i < anz; i++ )
  34. {
  35. DLLDatei *tmp = dlls->get( i );
  36. if( tmp &&tmp->name->istGleich( name ) )
  37. {
  38. tmp->ref++;
  39. cs.unlock();
  40. return tmp->handle;
  41. }
  42. }
  43. HINSTANCE h = LoadLibrary( pfad );
  44. if( !h )
  45. {
  46. cs.unlock();
  47. return 0;
  48. }
  49. DLLDatei *dll = new DLLDatei();
  50. dll->name = new Text( name );
  51. dll->handle = h;
  52. dll->ref = 1;
  53. dlls->add( dll );
  54. cs.unlock();
  55. return h;
  56. }
  57. void DLLRegister::releaseDLL( char *name )
  58. {
  59. cs.lock();
  60. int anz = dlls->getEintragAnzahl();
  61. for( int i = 0; i < anz; i++ )
  62. {
  63. DLLDatei *tmp = dlls->get( i );
  64. if( tmp &&tmp->name->istGleich( name ) )
  65. {
  66. tmp->ref--;
  67. if( !tmp->ref )
  68. {
  69. tmp->name->release();
  70. FreeLibrary( tmp->handle );
  71. delete tmp;
  72. dlls->remove( i );
  73. }
  74. cs.unlock();
  75. return;
  76. }
  77. }
  78. cs.unlock();
  79. }
  80. // Reference Counting
  81. DLLRegister *DLLRegister::getThis()
  82. {
  83. ref++;
  84. return this;
  85. }
  86. DLLRegister *DLLRegister::release()
  87. {
  88. ref--;
  89. if( !ref )
  90. delete this;
  91. return 0;
  92. }