Eine Frage zu ShFileOperation
-
Die entsprechenden Rechte sind vorhanden, denn das kopieren über den Explorer geht.
Gruß Udo
-
Vielleicht ist ja doch ein Fehler im Pfad. Prüf doch, vor dem Verschieben, ob der Pfad korrekt ist. Dafür könntest Du DirectoryExists() verwenden.
-
@Joe_M
DirectoryExists() liefert false, obwohl das Verzeichnis existiert und auch das Netzlaufwerk verbunden ist (Definitiv).
Ich vermute jetzt, das die Ursache des Problems ganz woanders liegt, nämlich im Zusammenspiel zweier von mir geschriebener Programme.
Ich versuche mal, den Ablauf zu erklären.Auf dem Rechner läuft ein Dienst, welcher in einem Thread einen bestimmten Ordner überwacht. Bei Eintreten eines definierten Ereignisses (erstellen einer Datei) wird eine Application gestartet (das ist die, in der die Probleme mit dem Netzwerkordner auftreten), welch mit der erstellten Datei bestimmte Aktionen ausführt.
Hier ein Codeausschnitt des Dienstes:
void __fastcall DcamThread::Execute() { DWord dwBytesReturned; char *cDir = GetRegValue(HKEY_CURRENT_USER,....); String Msg, OldFName, NewFName; bool IsValidFile; dwBytesReturned = 0; CreateDirHandle(cDir); DWORD bufSize = sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH*sizeof(WCHAR); while (!Terminated) { if (pHandle != INVALID_HANDLE_VALUE) { ZeroMemory(pWorkPtr, bufSize); ReadDirectoryChangesW(pHandle, &pWorkPtr, sizeof(pWorkPtr), false, // FILE_NOTIFY_CHANGE_FILE_NAME && FILE_NOTIFY_CHANGE_LAST_WRITE //&& // FILE_NOTIFY_CHANGE_DIR_NAME && // FILE_NOTIFY_CHANGE_ATTRIBUTES && // FILE_NOTIFY_CHANGE_LAST_ACCESS && // FILE_NOTIFY_CHANGE_CREATION , &dwBytesReturned, NULL, NULL); NewFName = ""; OldFName = ""; if (dwBytesReturned > 0) { switch(pWorkPtr->Action) { case FILE_ACTION_MODIFIED: if (ExtractFileExt(AnsiString(pWorkPtr->FileName)).UpperCase()==".DOC" && IsValidFile) { // erst wenn die zum aktuellen NC-Programm gehörende .doc-Datei erstellt bzw. // geändert wird das Konvertierungsprogramm starten FileAddAction(AnsiString("\""+(String)cDir+"\\"+ (String)pWorkPtr->FileName+"\"").c_str(),pWorkPtr->FileName); //--> die relevante Aktion auf dem Laufwerk } else { IsValidFile = (ExtractFileExt(AnsiString(pWorkPtr->FileName)).UpperCase()==".DR"); } break; case FILE_ACTION_REMOVED: ShowMessage("Datei gelöscht: "+(String)pWorkPtr->FileName); break; case FILE_ACTION_RENAMED_OLD_NAME: OldFName = (String)FILE_ACTION_RENAMED_OLD_NAME;break; case FILE_ACTION_RENAMED_NEW_NAME: NewFName = (String)FILE_ACTION_RENAMED_NEW_NAME;break; } if (!OldFName.IsEmpty()) { Msg = "Datei umbenannt von '"+OldFName+"' in '"+NewFName+"'"; } dwBytesReturned = 0; } } } delete pWorkPtr; delete pHandle; } //--------------------------------------------------------------------------- void __fastcall DcamThread::FileAddAction(const char* ParamName, const wchar_t* FName) { ExePath = AnsiString(GetRegValue(HKEY_LOCAL_MACHINE,....)); String FileExt = ExtractFileExt(FName); ncName = AnsiString(ParamName); ncName = ncName.SubString(1,ncName.Pos(FileExt))+"dr"; Synchronize(StartApplication((ExePath+"\\mitsu2sinumerik.exe").c_str(),ncName.c_str())); } //---------------------------------------------------------------------------
Das ganze läuft wunderbar bis auf die Tatsache, das in der gestarteten Application scheinbar überhaupt keine Netzwerkressourcen zur Verfügung stehen.
Kann sich das vielleicht mal einer von Euch Experten anschauen?
Gruß Udo
-
Ich nochmal.
Der Quelltextausschnitt aus dem vorigen Beitrag ist so:
... ... void __fastcall DcamThread::FileAddAction(const char* ParamName, const wchar_t* FName) { ExePath = AnsiString(GetRegValue(HKEY_LOCAL_MACHINE,....)); String FileExt = ExtractFileExt(FName); ncName = AnsiString(ParamName); ncName = ncName.SubString(1,ncName.Pos(FileExt))+"dr"; StartApplication((ExePath+"\\mitsu2sinumerik.exe").c_str(),ncName.c_str()); }
Synchronize geht nicht mit Funktionen, welche Parameter übernehmen.
Gruß Udo
-
Kommt das Programm (numerik.exe) denn mit Netzwerkressourcen klar, wenn es direkt aufgerufen wird, z.B. aus dem Explorer?
-
@Jansen
Auf die Idee,das zu probieren bin ich noch garnicht gekommen.
Werde das aber am Montag auf der Arbeit gleich testen und melde mich dann wieder.Gruß Udo
-
Hi,
kann es nicht sein, daß es nicht reicht wenn Du die Rechte hast, vielleicht mußt Du sie außerdem noch an System vergeben. Daran hapert es zum Beisppiel manchmal wenn die Paradoxusrslock auf C:\ geschreiben werden soll und Du hast da alle Rechte und es geht trotzdem nicht.
Nur mal so als möglicher Gedanke.Gruß Mümmel
-
Ich habe jetzt das Programm von der Kommandozeile gestartet. Es sind alle Netzwerkressourcen vorhanden und das Kopieren/Verschieben in den Netzwerkordner funktioniert tadellos.
Jetzt fällt mir auch wieder folgendes ein:
Irgendwann während der Entwicklung ist mir mal aufgefallen, dass im normalen Druckerdialog alle Netzwerkdrucker fehlen. Ich habe mir aber damals keinen Kopf drüber gemacht, weil ich die im Programm sowieso nicht brauche. Aber das beruht wahrscheinlich auf der gleichen Ursache.hat jemand von Euch einen Hinweis, was ich jetzt machen kann???
Gruß Udo
-
Hallo,
ich habe jetzt mal den Start der Exe mit 'CreateProcess(...)' durchgeführt.
---> Das gleiche Verhalten wie vorher.Jetzt habe ich die Vermutung, das das an der Installation des Dienstes liegt, er läuft unter dem normalen Systemkonto.
Wenn ich aber den Dienst unter meinem Konto laufen lasse, dann wird die Exe nicht gestartet (auch keine Fehlerausgabe).Gruß Udo
-
Hallo,
Ich muß den Post nochmal nach oben bringen.
Hat keiner eine Idee, was ich noch machen könnte???Gruß Udo
-
Hallo,
Udo_11 schrieb:
Jetzt habe ich die Vermutung, das das an der Installation des Dienstes liegt, er läuft unter dem normalen Systemkonto.
Und was ist nun daraus geworden? Kannst du deine Vermutung inzwischen bestätigen / entkräften?
Udo_11 schrieb:
Wenn ich aber den Dienst unter meinem Konto laufen lasse, dann wird die Exe nicht gestartet (auch keine Fehlerausgabe).
Das ist auch nicht das richtige Verhalten, oder?
MfG
-
Hallo,
wenn ein Dienst unter dem lokalen Systemkonto läuft, dann ist eine Interaktion mit dem Desktop möglich. --> Das Programm wird gestartet.
läuft der Dienst jedoch unter einem beliebigen Benutzerkonto, dann ist eine Interaktion mit dem Desktop nicht mehr möglich. -->das Programm wird nicht gestartet.
Ich nehme an, das ist das normale Verhalten eines Windowsdienstes.
Die Frage ist, ob es normales Verhalten ist, das unter dem lokalen Systemkonto keine Netzwerkressourcen zur Verfügung stehen und ob bzw. wie ich das ändern kann.
Gruß Udo
-
Klingt nachvollziehbar, was du da so schreibst... Alles in Allem bist du meiner Meinung nach mit deiner Frage im WinAPI-Forum besser aufgehoben - da habe ich zumindest mehr Threads zum Thema Dienste / Rechte gefunden... Das ist ja eher ne grundlegende Windowsfrage, als eine Borland-spezifische.
MfG
-
Vielleicht kann mich ja mal einer der Moderatoren ins API-Forum verschieben.
-
Naja... vielleicht nicht dich, aber den Thread bestimmt...
-
Hallo,
Bevor diesen Thread jemand in ein anderes Forum verschiebt, versuche ich mal die Lösung des Problems zu erklären:
Die Ursache dafür, das keine Netzwerkressourcen vorhanden waren ist, das die gestartete Anwendung unter dem Konto des Dienstes läuft, der si gestartet hat (in meinem Fall 'LocalSystem').
Lösung:
Die Anwendung muß von dem Dienst mit dem Konto des Nutzers (also mit meiner Anmeldung) gestartet werden und auf dem interaktiven Desktop, da sonst keine Interaktion mit der Anwendung möglich ist.
Alle dazu notwendigen schritte sind in der MSDN erläutert:
http://msdn.microsoft.com/de-de/library/aa379608(en-us,VS.85).aspx
Ich hoffe, das hilft bei ähnlichen Problemen.
Gruß Udo