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

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);

}