Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ strcpy problem (https://www.delphipraxis.net/186677-strcpy-problem.html)

EWeiss 22. Sep 2015 11:48

strcpy problem
 
Bekomme Zugriffsverletzung beim kopieren des String.
Zitat:

Unhandled exception at 0x59CD40D9 (msvcr120d.dll) in TestBassVis.exe: 0xC0000005: Access violation writing location 0x00000072.
Code:
char GetCurrentDir()
{
  char szCurrentDir[MAX_PATH];
  int i = GetCurrentDirectory(255, (LPWSTR)szCurrentDir);
  if (szCurrentDir[i - 1] == '\\')
   szCurrentDir[i - 1] = 0;

  return szCurrentDir[i];
}
Code:
char* Path = "\\SPlugins\\Visual Ball\\Ball.svp";
strcpy((char*) GetCurrentDir(), Path);

exec.Pluginfile = Path;
Ich möchte den Aktuellen Pfad vor "\\SPlugins\\Visual Ball\\Ball.svp"; kopieren.
Geht das überhaupt?

Leider krachts.

gruss

uligerhardt 22. Sep 2015 12:41

AW: strcpy problem
 
Zitat:

Zitat von EWeiss (Beitrag 1316602)
Code:
char GetCurrentDir()
{
  char szCurrentDir[MAX_PATH];
  int i = GetCurrentDirectory(255, (LPWSTR)szCurrentDir);
  if (szCurrentDir[i - 1] == '\\')
   szCurrentDir[i - 1] = 0;

  return szCurrentDir[i];
}
Code:
char* Path = "\\SPlugins\\Visual Ball\\Ball.svp";
strcpy((char*) GetCurrentDir(), Path);

exec.Pluginfile = Path;

Mein C ist ja etwas rostig, aber du scheinst in GetCurrentDir einen Character zurückzugeben (für ein Verzeichnis???), während du nachher auf Zeiger auf char castest. Nix gut. :mrgreen:

EWeiss 22. Sep 2015 13:26

AW: strcpy problem
 
Zitat:

Zitat von uligerhardt (Beitrag 1316609)
Zitat:

Zitat von EWeiss (Beitrag 1316602)
Code:
char GetCurrentDir()
{
  char szCurrentDir[MAX_PATH];
  int i = GetCurrentDirectory(255, (LPWSTR)szCurrentDir);
  if (szCurrentDir[i - 1] == '\\')
   szCurrentDir[i - 1] = 0;

  return szCurrentDir[i];
}
Code:
char* Path = "\\SPlugins\\Visual Ball\\Ball.svp";
strcpy((char*) GetCurrentDir(), Path);

exec.Pluginfile = Path;

Mein C ist ja etwas rostig, aber du scheinst in GetCurrentDir einen Character zurückzugeben (für ein Verzeichnis???), während du nachher auf Zeiger auf char castest. Nix gut. :mrgreen:

JUP.
Ich glaube meine Herangehensweise ist grundsätzlich falsch.

Anderer versuch.
Code:
      TCHAR currentDir[MAX_PATH];
      char Path[MAX_PATH];

      GetCurrentDirectory(MAX_PATH, currentDir);
      strcpy(Path, "SPlugins\\Visual Ball\\Ball.svp");

      exec.Pluginfile = Path;
Was nicht geht ist currentDir und Path zu verbinden.
Code:
currentDir + Path;
Will nicht.
Code:
exec.Pluginfile = currentDir + "SPlugins\\Visual Ball\\Ball.svp";
Auch nicht.
Zitat:

Error 2 error C2110: '+' : cannot add two pointers
gruss

mkinzler 22. Sep 2015 13:34

AW: strcpy problem
 
Code:
exec.Pluginfile = sprintf( "%sSPlugins\\Visual Ball\\Ball.svp", currentDir);

EWeiss 22. Sep 2015 13:46

AW: strcpy problem
 
Zitat:

Zitat von mkinzler (Beitrag 1316617)
Code:
exec.Pluginfile = sprintf( "%sSPlugins\\Visual Ball\\Ball.svp", currentDir);

Danke leider nein.
Zitat:

Error 2 error C2440: '=' : cannot convert from 'int' to 'char *'
Code:
char* Pluginfile;           // path to Plugin kind
Ich hasse diesen Konvertierungs Kram ;)

gruss

uligerhardt 22. Sep 2015 14:22

AW: strcpy problem
 
Muss es denn C sein? Vielleicht geht ja C++ mit ner String-Klasse? (std::string, CString, ...)

Edit: Schau dir mal MSDN-Library durchsuchenPathCombine und Co an.

EWeiss 22. Sep 2015 14:48

AW: strcpy problem
 
Zitat:

Zitat von uligerhardt (Beitrag 1316622)
Muss es denn C sein? Vielleicht geht ja C++ mit ner String-Klasse? (std::string, CString, ...)

Edit: Schau dir mal MSDN-Library durchsuchenPathCombine und Co an.

Ja leider ;) bzw.. ist doch C++
Ist ein C++ Sample für meine Lib.

Habe es jetzt so gemacht.

Code:
char currentDir[MAX_PATH];
char Path[MAX_PATH];

GetCurrentDirectoryA(MAX_PATH, (LPSTR) currentDir);
sprintf(Path, "%s%s", currentDir, "\\SPlugins\\Visual Ball\\Ball.svp");

exec.Pluginfile = Path;
funktioniert..
Aber hier bekomme ich bei currentDir nur das erste zeichen C + den zweiten Pfad
Code:
char currentDir[MAX_PATH];
char Path[MAX_PATH];

GetCurrentDirectory(MAX_PATH, (LPWSTR) currentDir);
sprintf(Path, "%s%s", currentDir, "\\SPlugins\\Visual Ball\\Ball.svp");

exec.Pluginfile = Path;
GetCurrentDirectory ist dann automatisch GetCurrentDirectoryW.

Sieht dann so aus
"CSPlugins\Visual Ball\Ball.svp"

Warum geht es nicht mit WideChar.

gruss

uligerhardt 22. Sep 2015 14:57

AW: strcpy problem
 
Zitat:

Zitat von EWeiss (Beitrag 1316627)
Zitat:

Zitat von uligerhardt (Beitrag 1316622)
Muss es denn C sein? Vielleicht geht ja C++ mit ner String-Klasse? (std::string, CString, ...)

Edit: Schau dir mal MSDN-Library durchsuchenPathCombine und Co an.

Ja leider ;) bzw.. ist doch C++
Ist ein C++ Sample für meine Lib.

Dann nimm std::string anstelle von char*. Das macht den Schmerz erträglicher. :-)

Zitat:

Zitat von EWeiss (Beitrag 1316627)
Code:
char currentDir[MAX_PATH];
char Path[MAX_PATH];

GetCurrentDirectoryA(MAX_PATH, (LPSTR) currentDir);
sprintf(Path, "%s%s", currentDir, "\\SPlugins\\Visual Ball\\Ball.svp");

exec.Pluginfile = Path;
funktioniert..
Aber hier bekomme ich bei currentDir nur das erste zeichen C + den zweiten Pfad
Code:
char currentDir[MAX_PATH];
char Path[MAX_PATH];

GetCurrentDirectory(MAX_PATH, (LPWSTR) currentDir);
sprintf(Path, "%s%s", currentDir, "\\SPlugins\\Visual Ball\\Ball.svp");

exec.Pluginfile = Path;
GetCurrentDirectory ist dann automatisch GetCurrentDirectoryW.

Sieht dann so aus
"CSPlugins\Visual Ball\Ball.svp"

Warum geht es nicht mit WideChar.

Bin da kein Experte, aber LPWSTR dürfte Zeiger auf WideChar sein, während char AnsiChar ist. Ich denke, am besten nimmst du entweder durchgängig WCHAR, LPWSTR etc. (also Unicode) oder durchgängig die Varianten mit T: TCHAR, LPTSTR etc. (die per Compilerschalter zwischen A und W wechseln können).

EWeiss 22. Sep 2015 15:21

AW: strcpy problem
 
Zitat:

Bin da kein Experte, aber LPWSTR dürfte Zeiger auf WideChar sein, während char AnsiChar ist. Ich denke, am besten nimmst du entweder durchgängig WCHAR, LPWSTR etc. (also Unicode) oder durchgängig die Varianten mit T: TCHAR, LPTSTR etc. (die per Compilerschalter zwischen A und W wechseln können).
Ok werde das mal checken..

Danke.

gruss

Zacherl 22. Sep 2015 15:36

AW: strcpy problem
 
Zitat:

Zitat von uligerhardt (Beitrag 1316630)
Bin da kein Experte, aber LPWSTR dürfte Zeiger auf WideChar sein, während char AnsiChar ist. Ich denke, am besten nimmst du entweder durchgängig WCHAR, LPWSTR etc. (also Unicode) oder durchgängig die Varianten mit T: TCHAR, LPTSTR etc. (die per Compilerschalter zwischen A und W wechseln können).

Genau richtig. Und da C-Strings nullterminiert sind, wird die hinterstehende 0 des ersten Zeichens vom WideString als Ende der Zeichenkette interpretiert.

Würde dir definitiv auch zu std::string raten, da dort unter anderem der "Add" Operator überladen wird, sodass du Strings wie gewohnt mit + konkatenieren kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz