Knowledge Base Nr: 00155 dllthread.cpp - http://www.swe-kaiser.de

Downloads:

Win32: Template f�r eine DLL die mittels einem Thread Daten sammelt.
Der Zugriff auf die Daten ist �ber eine Critical Section verriegelt.
(Wird die DLL von mehreren Prozessen benutzt w�re ein Mutex evtl. sinnvoller.)

  
int g_nErr = 0;
char g_szError[MAX_DATA] = {0};

CRITICAL_SECTION g_cs;

void GetData3964() //3964
{
...
::EnterCriticalSection(&g_cs);
g_nErr = 1;
sprintf(g_szError, "ERROR: COM%d nicht verf�gbar!", g_nPortNo+1);
::LeaveCriticalSection(&g_cs);
...
}

DWORD WINAPI GetData3964Thread(LPVOID lpParameter)
{
while (1)
{
GetData3964();
Sleep(1000);
}
}

//////////////

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
HANDLE hnd;

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
::InitializeCriticalSection(&g_cs);

hnd = CreateThread(
0, // pointer to security attributes
0, // initial thread stack size
GetData3964Thread, // pointer to thread function
0, // argument for new thread
0, // creation flags
0 // pointer to receive thread ID
);

if (!hnd)
::MessageBox(NULL, "Kommunikations-Thread kann nicht erzeugt werden!", "Kritischer Fehler", MB_ICONERROR|MB_OK);

break;

case DLL_PROCESS_DETACH:
::DeleteCriticalSection(&g_cs);
break;
}

return TRUE;
}

//////////////

FAWDLL_API int PASCAL GetError()
{
int nError = 0;

::EnterCriticalSection(&g_cs);

nValue = g_nErr;

::LeaveCriticalSection(&g_cs);

if (nError > 0)
MessageBox(NULL, "Function GetFunctionError(): irgendein Fehler!", "Kritischer Fehler!", MB_ICONERROR|MB_OK);

return nError;
}

FAWDLL_API void PASCAL GetErrorString(char* szValueError)
{
::EnterCriticalSection(&g_cs);

strcpy(szValueError, g_szError);

::LeaveCriticalSection(&g_cs);

}