Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Листинги / Листинги / 32-02-DllMain

.cpp
Скачиваний:
4
Добавлен:
24.03.2016
Размер:
1.83 Кб
Скачать
#include <windows.h>
#include <iostream.h>

DWORD  dwTlsIndex;   // индекс динамической локальной памяти потока

// главная функция
BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
{
  BOOL  retVal = TRUE;   // возвращаемое значение
  int    *pCount;        // указатель на счетчик

  switch (dwReason)
  {
  case DLL_PROCESS_ATTACH:   // загрузка DLL
    // распределяем локальную память потоков
    dwTlsIndex = TlsAlloc();
    if (dwTlsIndex == -1)
    {
      cerr << "Tls allocation failed." << endl;
      retVal = FALSE;
    }
    break;
  case DLL_THREAD_ATTACH:    // создание потока
    // захватываем память под счетчик
    pCount = new int(0);
    // запоминаем указатель в индексе
    if (!TlsSetValue(dwTlsIndex, (LPVOID)pCount))
    {
      cerr << "Tls set value failed." << endl;
      retVal = FALSE;
    }
    break;
  case DLL_THREAD_DETACH:    // завершение потока
    // получаем указатель из индекса
    pCount = (int*)TlsGetValue(dwTlsIndex);
    // если ошибка, то выдаем сообщение
    if (!pCount)
    {
      cerr << "Tls get value failed." << endl;
      retVal = FALSE;
    }
    // иначе, освобождаем память
    else
      delete pCount;
    break;
  case DLL_PROCESS_DETACH:  // отключение DLL
    // освобождаем локальную память потока
    if (!TlsFree(dwTlsIndex))
    {
      cerr << "Tls free failed." << endl;
      retVal = FALSE;
    }
    break;
  }

  return retVal;
}

extern "C" __declspec(dllexport) int Add(int n)
{
  int  *pCount;

  // получаем указатель на локальный счетчик
  pCount = (int*)TlsGetValue(dwTlsIndex);
  if (!pCount)
  {
    cerr << "Tls get value failed." << endl;
    return GetLastError();
  }
  // увеличиваем значение счетчика
  *pCount += n;

  return *pCount;
}
Соседние файлы в папке Листинги