DLLDateien.cpp 1.6 KB

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