ShellExecuteW İşlemi Bitirmesini Bekleme

C, C++ ve C++ Builder ile ilgili konuları buraya yazabilirsiniz.
Cevapla
theSinan02
Üye
Mesajlar: 26
Kayıt: 15 Eyl 2014 11:33

ShellExecuteW İşlemi Bitirmesini Bekleme

Mesaj gönderen theSinan02 » 08 Ara 2017 03:26

S.a


thread içerisinde Aşağıdaki Kodu Çalıştırıyorum
firebird yedek alıyor

Kod: Tümünü seç

String PARAMETRE = "  -v -t -user SYSDBA -password masterkey -y C:\\temp\\WOLVOX.log D:\\AKINSOFT\\Wolvox7\\Database_FB\\KARDESLER\\2017\\WOLVOX.FDB C:\\temp\\WOLVOX.FBK";

String FIREBIRD_GBAK ="C:\\Program Files (x86)\\Firebird\Firebird_2_5\\bin\gbak.exe";						

 wchar_t ANAHTAR[]=L"open";
 ShellExecuteW( 0,ANAHTAR,FIREBIRD_GBAK.w_str() ,PARAMETRE.w_str(), NULL, SW_HIDE);


yedeklemeden sonra sıkıştırmak

Kod: Tümünü seç


	Form1->DEGISKEN->DOSYA_LISTESI->Clear();
	Form1->DEGISKEN->DOSYA_LISTESI->Add( "C:\\temp\\WOLVOX.FBK");
	Form1->DOSYA_SIKISTIR("C:\\temp\\.zip", Form1->DEGISKEN->DOSYA_LISTESI  );

fonksiyona gönderdiğimde
C:\\temp\\WOLVOX.FBK Dosya Başka Bir işlem tarafından kullanıldığından bu işlem dosyaya erişemiyor hatası veriyor

Yani anladığım
ShellExecuteW(
ta yedekleme sona ermeden sonraki komuta geçiyor
ShellExecuteW işlemini bitirmesini nasıl beklerim

aşadıdaki kod ise sıkıştırma fonksiyonum

Kod: Tümünü seç

Form1 tanımlanmış DOSYA ZİPLEME FONKSİYONUM
String __fastcall TForm1::DOSYA_SIKISTIR(String KAYNAK, TStringList *KOPYALANACAK_DOSYALAR)

{
	  TZipFile * ZIP = new TZipFile() ;

	  try
		{

		  try
			{
				//KOPYALANACAK_DOSYALAR = new TStringList();
				Sleep(Form1->DEGISKEN->PROGRAM_BEKLEME_SURESI);
				ZIP->Open(KAYNAK,zmWrite) ;
				for(int i=0; i < (KOPYALANACAK_DOSYALAR->Count) ;i++)
				{
				ZIP->Add(KOPYALANACAK_DOSYALAR->Strings[i], KOPYALANACAK_DOSYALAR->Strings[i].SubString(   KOPYALANACAK_DOSYALAR->Strings[i].Pos(Form1->BILGISAYAR_ADI_AL()) ,(KOPYALANACAK_DOSYALAR->Strings[i].Length() - KOPYALANACAK_DOSYALAR->Strings[i].Pos(Form1->BILGISAYAR_ADI_AL()))+1)) ;
				}
				ZIP->Close();
				Sleep(Form1->DEGISKEN->PROGRAM_BEKLEME_SURESI);

return "Tamam";

			}
			catch(Exception *HATA)
			{

			Form1->HATA->LISTELE("Dosya Sıkıştırma : "+HATA->Message);
			return "Dosya Sıkıştırma Hatası : "+HATA->Message;
			}

		}
		__finally
		{
		ZIP->Free();
		}



		return "Tamam";


}


theSinan02
Üye
Mesajlar: 26
Kayıt: 15 Eyl 2014 11:33

Re: ShellExecuteW İşlemi Bitirmesini Bekleme

Mesaj gönderen theSinan02 » 11 Ara 2017 09:22

S.A
ShellExecuteW yerine
Firedac ın FDIBBackup ile Yedekleyince Sorunum Çözüldü

Kod: Tümünü seç

FDIBBackup1.DriverLink := FDPhysFBDriverLink1;
 
FDIBBackup1.UserName := 'sysdba';
FDIBBackup1.Password := 'masterkey';
FDIBBackup1.Host := 'db_srv_host';
FDIBBackup1.Protocol := ipTCPIP;
 
FDIBBackup1.Database := 'e:\fb\addemo.fdb';
FDIBBackup1.BackupFiles.Add('e:\fb\addemo.backup');
 
FDIBBackup1.Backup;


Cevapla