Rückgabewert abwarten? ShellExecute?
-
Hi,
ich möchte Netzlaufwerke aus meinem Programm heraus anlegen können.
Bisher mache ich es so:CString strNetCmd; strNetCmd = "net use x: \\\\"; strNetCmd += stringip; strNetCmd += "\\" + stringpfad; WinExec(LPCSTR(strNetCnd),SW_HIDE);Das ist zwar schöner als eine Batchdatei, aber es gibt absolut keinen
Aufschluss über eventuelle Fehler, auf die man reagieren könnte.Nun dachte ich mit SHELLEXECUTEINFO könnte man da evtl. noch etwas
erreichen. Da bin ich mir aber nicht sicher wie ich welche Parameter angebe.Ich hatte mir da sowas vorgestellt:
SHELLEXECUTEINFO se={0}; se.cbSize = sizeof(se); se.lpFile = _T("cmd"); se.lpParameters = "net use x: \\\\192.168.99.98\\meinShare meinpass /PERSISTENT:YES /user:Udo"; se.nShow = SW_HIDE; se.fMask = SEE_MASK_NOCLOSEPROCESS; ShellExecuteEx( &se ); if (se.hProcess) { WaitForSingleObject(se.hProcess, INFINITE); CloseHandle(se.hProcess); }
-
Und warum nimmst Du icht direkt die entsprechenden API Funktionen?
WNetAddConnection(2)
http://msdn2.microsoft.com/en-us/library/aa385410(VS.85).aspx
-
Hallo Martin,
du hast recht. Nur warum schmiert bei mir z.B. beim Anlegen des
Share gleich die Anwendung ab??Das Laufwerk wird angelegt und ist auch nutzbar, aber ich crashe immer wegen
dem char ch_lfw...Das war definitiv sonst nicht der Fall.Der Aufruf:
CString cs_lfw ="j"; char ch_lfw; strcpy(&ch_lfw,cs_lfw); DWORD res = ConnectNetworkDrive("\\\\192.168.100.1\\test123",ch_lfw,"blPermanent");Die Funktion:
DWORD test1::ConnectNetworkDrive(CString slNetPath, char clDrive, bool blPermanent) { char cPath[3] = { char(0), ':', char(0) }; cPath[0] = toupper(clDrive); CString slRemotePath=slNetPath; NETRESOURCE nr; ZeroMemory(&nr, sizeof(nr)); nr.dwScope= RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_DISK; nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC; nr.dwUsage=RESOURCEUSAGE_CONNECTABLE; nr.lpLocalName=cPath; nr.lpRemoteName=slRemotePath.GetBuffer(); nr.lpComment=NULL; nr.lpProvider=NULL; int ilResult = WNetAddConnection2(&nr, (LPSTR) NULL, (LPSTR) NULL,blPermanent ? CONNECT_UPDATE_PROFILE : 0); return ilResult; }
-
Ich bleibe in der ATLSIMPSTR.H an dieser Stelle hängen laut Debugger:
void Release() throw() { ATLASSERT( nRefs != 0 ); if( _InterlockedDecrement( &nRefs ) <= 0 ) { pStringMgr->Free( this ); //<---??? } }In einer DLL habe ich den gleichen Code, der ohne Fehler durchläuft!
-
Ich habe aktuell die Doku nicht im Kopf, die Du einfach lesen solltest!
Wenn lpRemoteName beschrieben wird dann ist Dein Buffer evtl. zu klein.
GetBuffer(_MAX_PATH) müsstest Du dann durchführen.
Die Zeiger sind LPTSTR, es sind eben keine LPCTSTR!
-
Martin, das wars

GetBuffer(MAX_PATH)Danke. Ist mir nur schleierhaft, warum das bisher immer
durchkompilierte...
-
Einmal für die Nachwelt:
Ich habe jetzt einen CString genommen. Man sollte noch prüfen,
ob der Doppelpunkt fürs Laufwerk auch enthalten ist ("j:" z.B.).
Wenn nicht, dann kann auch kein Share angelegt werden!LPTSTR lpStr = clDrive.GetBuffer( clDrive.GetLength() ); CString slRemotePath=slNetPath; NETRESOURCE nr; ZeroMemory(&nr, sizeof(nr)); nr.dwScope= RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_DISK; nr.dwDisplayType=RESOURCEDISPLAYTYPE_GENERIC; nr.dwUsage=RESOURCEUSAGE_CONNECTABLE; nr.lpLocalName=lpStr; nr.lpRemoteName=slRemotePath.GetBuffer(MAX_PATH); nr.lpComment=NULL; nr.lpProvider=NULL; int ilResult = WNetAddConnection2(&nr, (LPSTR) NULL, (LPSTR) NULL,blPermanent ? CONNECT_UPDATE_PROFILE : 0); return ilResult;DWORD Test1::ConnectNetworkDrive(CString slNetPath, CString clDrive, bool blPermanent);
-
Du solltest Dich mal etwas mehr mit der CString Klasse beschäftigen!
Das ist überflüssig:
LPTSTR lpStr = clDrive.GetBuffer( clDrive.GetLength() );Hier tut es:
LPTSTR lpStr = clDrive.GetBuffer();
-
Jupp, kann sein, dass ich es irgendwie beim rumspielen mit dem char
gebraucht habe. Dunno