ReadDirectoryChangesW funktioniert nicht im Debug Mode.
-
Hey Peoplez,
also ich habe folgendes Problem. Ich nutze die WinAPI ReadDirectoryChangesW
in der Releaseversion des Dienstes funktioniert die auch. Doch sobald ich den Dienst debuggen will funktioniert die Funktion nicht mehr und liefert mir Fehlercode 6. Was soviel bedeutet wie ERROR_INVALID_HANDLE nun woran liegt das ?Folgender Code wird verwendet.
LPCTSTR arPrivelegeNames[]= {SE_BACKUP_NAME,SE_RESTORE_NAME,SE_CHANGE_NOTIFY_NAME}; for(int i = 0; i < sizeof(arPrivelegeNames) / sizeof(arPrivelegeNames[0]); ++i) { if( !EnablePrivilege(arPrivelegeNames[i], TRUE) ) { TRACE(_T("Unable to enable privilege: %s -- GetLastError(): %d\n"),arPrivelegeNames[i], GetLastError()); TRACE(_T("File: %s Line: %d\n"), _T(__FILE__), __LINE__); } } m_hComPort = NULL; DirInfo.hDir = CreateFile(m_strWatchPath,FILE_LIST_DIRECTORY,FILE_SHARE_READ FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS|FILE_FLAG_OVERLAPPED,NULL); if (INVALID_HANDLE_VALUE == DirInfo.hDir) { // Something is wrong ! The Directory doesn't exists char szMsg[256]; sprintf(szMsg,"Das angegebene Verzeichnis konnte nicht geöffnet werden !\nVerzeichnis: %s\nReturn Code: %d\n",m_strWatchPath,GetLastError()); pLTdbi->AddToMessageLog(szMsg); // Thread will be closed !! // Now we have to stop the Service SetEvent(pTP->m_hStopEvent); return 0; } memset(lpOverlapped, 0, sizeof(lpOverlapped)); DirInfo.dwBufLength = sizeof(DirInfo.lpBuffer); strcpy(DirInfo.lpszDirName,m_strWatchPath); m_hComPort = CreateIoCompletionPort(DirInfo.hDir,m_hComPort,(DWORD)&DirInfo,0); if (0 == ReadDirectoryChangesW( DirInfo.hDir,DirInfo.lpBuffer,MAX_BUFFER,TRUE,FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_SIZE,&DirInfo.dwBufLength,&D irInfo.Overlapped,NULL)) { // Something is wrong DWORD dwErr = GetLastError(); printf("Error ReadDirectoryChangesW RC = %d\n",dwErr); }[ Dieser Beitrag wurde am 07.07.2003 um 10:36 Uhr von DaDaywalker editiert. ]
-
1.Ist das nun ein deutscher oder englischer Dienst?
2.Was ist lpOverlapped?
3.Bist du sicher, dass man CreateIoCompletionPort auf Directories anwenden kann? Ich hab da nur was von Dateien gelesen.
-
1. Nun was es für ein Dienst ist, ist doch egal oder nicht ? Ich meine
ob Deutsch oder Englisch spielt derzeit keine Rolle.
2. lpOverlapped... schau mal in der MSDN ....
The OVERLAPPED structure contains information used in asynchronous input and output (I/O). Und nun rate mal was das LP bedeutet.
3. Ja ich bin mir ziemlich sicher das das funktioniert. Um genau zu sein ich weiß es aber diese Fragen lösen mein Problem nicht !!!!!!!!!!!!!!Also was Konstruktives wäre mir da schon recht danke euch !
MFG

-
Zu 1.
Es war nur eine informative Frage, da es sich echt komisch liest, mal deutsch, mal englisch!Zu 2.
Haha, in der MSDN gibts kein lpOverlapped, ich wollte von Dir nur wissen, wie DEIN lpOverlapped deklariert und initialisiert ist.Zu 3.
War eher informativ für mich, da mich interessiert, wie man über die serielle Schnittstelle dem Filesystem mitteilt, wann eine neue Datei anfängt.
-
Serielle Schnittstelle na jetzt wirds interessant ?!?
m_hComPort -> heist Handle auf eine Completion Port !
Und seid wann hat die Funktion CreatIOCompletionPort was mit Seriellen Schnittstellen zu tun.Es wäre wirklich goldig das Problem zu lösen und nicht ständig erklären zu müssen wie was zu verstehen ist. Das können wir gern ein anderes mal klären.
Thema 2: Richtig ich weis das dies nicht in der MSDN steht deswegen habe ich gesagt OVERLAPPED ....
und dich dann gefragt was das lp wohl bedeuten mag ???so ist es in der winbase.h definiert also ist das so schwer ?
typedef struct _OVERLAPPED { DWORD Internal; DWORD InternalHigh; DWORD Offset; DWORD OffsetHigh; HANDLE hEvent; } OVERLAPPED, *LPOVERLAPPED;
-
Ach?
Da bekommt man 'nen Codefetzen vorgeworfen, versucht, sich in dem Chaos zurechtzufinden, zu helfen und wird dann auch noch vollgepflaumt?Zeile 9: m_hComPort = NULL;
Ist echt Sch..., mitten im Code irgendwelche Handles auf NULL zu setzen. Sowas macht man normalerweise während der Initialisierung.
2.
Zeile 23: memset(lpOverlapped, 0, sizeof(lpOverlapped));Und auf was zeigt jetzt lpOverlapped. Da Du uns diese wichtige Information ja unbedingt vorenthalten willst, nahm ich an, dass 'lpOverlapped = &DirInfo.Overlapped' ist, womit nämlich geklärt wäre, dass in Deine Overlapped-Stuktur ein ungültiges Event-Handle existiert.
-
Du sagst:
m_hComPort = CreateIoCompletionPort(DirInfo.hDir,m_hComPort,(DWORD)&DirInfo,0);aber in ReadDir.. usw. wird eine initiale Overlapped-Struktur übergeben.
Es müßte ausreichen das m_hComPort in die Overlapped-Struktur zu kopieren.
-
Frank II ich probiere es mal aus Moment...
ReneG bitte fühl dich persönlich angegriffen.
Ich meine ich versteh schon das du mir helfen willst aber in dem du hier sachen kritisierst wird das auch nichts...aber trotzdem danke..
-
ReneG bitte fühl dich persönlich angegriffen.
Tue ich auch, denn ich würde dir nicht solche komischen Sachen erzählen, innerhalb einer OVERLAPPED-Struktur, die einen Event erwartet, einen Completion-Port anzugeben!
-
es gibt im MSDN ein Beispiel:fwatch das macht genau das was du brauchst.
-
Ok leutz bevor die gemühter hier Hochkochen...
ich habe es gefunden....
nein es ist nicht die omminöse kopieraktion sondern einfach das
memset auf die Struktur (die Initialisierung) denn diese muss auch für die DirInfo durchgeführt werden...also leutz danke für die Hilfe......
trotzdem.........Nobody is perfect.... thanx for all
-
Nice site!