Delphi ja bat

Pitäisi saada bat tiedosto suoritettua. Tämä toimiikin muuten hyvin, paitsi jos polussa on skandeja. Esim. tämä ei toimi, koska ä ja ö tulostuvat dos:ssa väärin.

var batchfile: Tstringlist;
begin
batchfile := TStringList.Create;
batchfile.add('"C:\Documents and Settings\JK\Työpöytä\Tiedosto.exe"');
batchfile.SaveToFile(tempdir 'Tiedosto.bat');
batchfile.Free;
chdir('c:\');
WinExec(PChar(tempdir 'Tiedosto.bat'),sw_hide);
end;

Kellään ideaa miten tämän saisi toimimaan aina?
Ilmianna
Jaa

5 Vastausta



Kommentoi
Ilmianna
Jaa
2 VASTAUSTA:
Siihen löytyikin ihan extractshortpathname()
Kommentoi
Ilmianna
Jaa
Ideasta kirjoitti:
Siihen löytyikin ihan extractshortpathname()
Ei auta asiaa.
Kommentoi
Ilmianna
Jaa
+Lisää kommentti
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders ja sieltä desktop.

Kun ohjelmallisesti sen tuolta luet niin menee nuo skanditkin ihan nappiin...
Ilmianna
Jaa
windows käyttää Windows-1252 -merkkikoodausta (uudemmat sisäisesti Unicode / UTF-16LE, mutta se ei ole tässä olennaista).

MS-DOS ja windowsin komentorivi käyttää OEM850 -koodausta.

jotta ä ja ö toimisivat oikein: CharToOemBuff function

https://msdn.microsoft.com/en-us/library/windows/desktop/dd319646(v=vs.85).aspx

Jos käytät CharToOemBuff -funktiota oikein, niin toki toimii ä tai ö -sisältävät tiedoston tai hakemiston nimet ihan oikein.

Jäynä on siinä, että jos ET KÄYTÄ tuota CharToOemBuff -funktiota, niin bat -tiedosto ei saa parametriksi ä tai ö -kirjainta lainkaan, vaan jonkun ihan väärän merkin.

Syynä on se, että .bat -tiedostossa merkkivalikoima/-koodaus on sama kuin MS-DOSissa eli oem850 eikä Windows-1252.

HUOM:

Itseasiassa CharToOemBuff -funktiota ei ole olemassa !

Sensijaan on olemassa CharToOemBuffA ja CharToOemBuffW -funktiot.

Eli jos lähde on AnsiString niin käytä CharToOemBuffA.

Jos lähde on WideString tai UnicodeString, niin käytä CharToOemBuffW.

HUOM: Jos lähde on pelkkä String, niin huomaa:

Vanhemmat versiot KUIN Delphi 2009:

type
String = AnsiString;

Delphi 2009 sekä sitä uudemmat versiot:

type
String = UnicodeString;

em. tyyppimäärityksiä et siis kirjoita sinä, vaan ne ovat Delphissä jo valmiiksi voimassa !

Delphin CharToOemBuff -funktio on siis itseasiassa alias:

Vanhemmat versiot KUIN Delphi 2009:

CharToOemBuff = CharToOemBuffA

Delphi 2009 sekä sitä uudemmat versiot:

CharToOemBuff = CharToOemBuffW
Ilmianna
Jaa

Vastaa alkuperäiseen viestiin

Delphi ja bat

Pitäisi saada bat tiedosto suoritettua. Tämä toimiikin muuten hyvin, paitsi jos polussa on skandeja. Esim. tämä ei toimi, koska ä ja ö tulostuvat dos:ssa väärin.

var batchfile: Tstringlist;
begin
batchfile := TStringList.Create;
batchfile.add('"C:\Documents and Settings\JK\Työpöytä\Tiedosto.exe"');
batchfile.SaveToFile(tempdir 'Tiedosto.bat');
batchfile.Free;
chdir('c:\');
WinExec(PChar(tempdir 'Tiedosto.bat'),sw_hide);
end;

Kellään ideaa miten tämän saisi toimimaan aina?

5000 merkkiä jäljellä

Peruuta