*** test.prg nEType = 2 nEventID = 1001 nUserID = 0 DIMENSION aMsg[2] aMsg[1] = 'Something happened' aMsg[2] = 'This is what happened' ? Report_Event(@aMsg, 2, 'My Application', nEType, nEventID, nUserID) &&.F. FUNCTION Report_Event(taMsg, tnMsgCount, tcApp, tnEType, tnEventID, tnUserID) DECLARE LONG RegisterEventSource IN advapi32.dll ; STRING, STRING DECLARE LONG DeregisterEventSource IN advapi32.dll ; LONG DECLARE INTEGER ReportEvent IN advapi32.dll ; INTEGER nES, INTEGER nEType, INTEGER nPtrCat, ; INTEGER nEventID, INTEGER nUserID, INTEGER nNumString, ; INTEGER nDataSize, INTEGER nPtrMsg, INTEGER nData DECLARE INTEGER HeapCreate IN Win32Api INTEGER nOptions, ; INTEGER nSize, INTEGER nMaxSize DECLARE INTEGER HeapDestroy IN Win32Api INTEGER nHeap DECLARE INTEGER HeapAlloc IN Win32Api ; INTEGER nHeap, INTEGER nFlags, INTEGER nSize DECLARE INTEGER HeapFree IN Win32Api ; INTEGER nHeap, INTEGER nFlags, INTEGER nAddress DECLARE RtlMoveMemory IN Win32Api AS CopyMemTo ; INTEGER, STRING @, INTEGER DECLARE RtlMoveMemory IN Win32Api AS CopyMemFrom ; STRING @, INTEGER, INTEGER LOCAL nDataSize, nData, nPtrCat, nPtrArray *** set to zero for now STORE 0 TO nDataSize, nData, nPtrCat, nPtrArray LOCAL i, nMemAlloc, aAddress[1], cMsg, nArraySize, cAddrLst, ; nHeap, nPtrMsg, cMsg, nSize IF tnMsgCount > 0 THEN cAddrLst = '' nMemAlloc = 0 FOR i = 1 TO tnMsgCount nMemAlloc = nMemAlloc + LEN(taMsg[i]) + 1 ENDFOR nArraySize = tnMsgCount * 4 nMemAlloc = nMemAlloc + nArraySize + 1024 &&add 1K just in case DIMENSION aAddress[tnMsgCount] nHeap = HeapCreate(0, nMemAlloc, nMemAlloc) FOR i = 1 TO tnMsgCount cMsg = taMsg[i] + CHR(0) nSize = LEN(cMsg) nPtrMsg = HeapAlloc(nHeap, 0, nSize) **Save address in array to release later aAddress[i] = nPtrMsg **Assign string to address CopyMemTo(nPtrMsg, cMsg, nSize) **build string of binary addresses cAddrLst = cAddrLst + NumToDWord(nPtrMsg) ENDFOR nPtrArray = HeapAlloc(nHeap, 0, nArraySize) CopyMemTo(nPtrArray, cAddrLst, nArraySize) ENDIF LOCAL nES, nResult nES = RegisterEventSource('', tcApp) nResult = ReportEvent(nES, tnEType, nPtrCat, ; tnEventID, tnUserID, tnMsgCount, nDataSize, nPtrArray, nData) <> 0 IF nPtrArray > 0 THEN **Free the array pointer HeapFree(nHeap, 0, nPtrArray) FOR i = 1 TO tnMsgCount **Free the address of each message string HeapFree(nHeap, 0, aAddress[i]) ENDFOR HeapDestroy(nHeap) ENDIF DeregisterEventSource(nES) RETURN nResult ENDFUNC FUNCTION NumToDWord(tnVal) #DEFINE DWORDOFFSET 2147483648 LOCAL cBin cBin = BINTOC(tnVal - DWORDOFFSET) RETURN SUBSTR(cBin,4,1) + SUBSTR(cBin,3,1) + ; SUBSTR(cBin,2,1) + SUBSTR(cBin,1,1) ENDFUNC *** end test.prgHTH