[MFC] Code funktioniert nicht auf andren rechner

new era

Grünschnabel
Ich habe ein MFC App indem man unter anderen per Buttondruck das Cd Laufwerk öffnen und schliessen lassen kann! Das soweit auch auf meinem Rechner! Aber auf einem anderen rechner, bei dem VC++ 6 nicht installiert ist, passiert nichts wenn ich den Button drücke!

Code:
BOOL DoOpenCdRom(void) 
{ 
  char chrRc[256]; 
  char *ptrChrRc = &chrRc[0]; 
  return mciSendString("Set CDAudio Door Open\0",ptrChrRc,256,NULL); 
  
} 

BOOL DoCloseCdRom(void) 
{ 

  char chrRc[256]; 
  char *ptrChrRc = &chrRc[0]; 
  return mciSendString("Set CDAudio Door Closed\0",ptrChrRc,256,NULL); 
}

Was ist da falsch?
 

chibisuke

Erfahrenes Mitglied
Ich seh hier nirgends auch nur ein stück MFC.... das is ANSI-C code realisiert mit hilfe des windows APIs - kann daher also nie und nimmer MFC sein...

und im MFC benutzt man auch keine char* sondern CString*

und wenns dir dann noch nich aufgefallen is..

char chrRc[256];
char *ptrChrRc = &chrRc[0];

das is schwachsinn... wozu brauchst du eine kopie des pointers? immerhin ist ein char[] und ein char* das gleiche abgesehen davon das der speicherort und grüße beim char[] zwangsläufig statisch ist, und beim char* es auch dynamisch sein kann..
von dem ganz abgesehen wird niemand irgendwann eine referenzierung eines von char[0] vornehmen weil es das gleiche ergibt wie wenn du das [0] weg läst..

außerdem hängt der compiler das \0 automatisch an dir strings an, und 2x is es überflüssig

damit sieht das ganze schon um einiges besser aus...

das heißt wenn du das erstmal weg machst siehts so aus:

BOOL DoOpenCdRom(void)
{
char chrRc[256];
return mciSendString("Set CDAudio Door Open",chrRc,256,NULL);

}

BOOL DoCloseCdRom(void)
{
char chrRc[256];
return mciSendString("Set CDAudio Door Closed",chrRc,256,NULL);
}

und was das eigendliche problem angeht... im sourcecode seh ich keinen fehler, das liegt vermutlich daran das du mit diesem mciSendString ja direkt den treiber ansprichst, und das der vieleicht das nicht richtig abarbeitet oder ähnliches, genauer kann ichs dir nich sagen mit den spärlichen informationen die du da rausgerückt hast...
 

Daniel Toplak

Erfahrenes Mitglied
Du köntest z.B. den Fehler auswerten, wenn die Funktion mciSendString schief geht:
Code:
BOOL DoOpenCdRom(void) 
{ 
  char chrRc[256]; 
  MCIERROR err;
  err = mciSendString("Set CDAudio Door Open",chrRc,256,NULL); 
  if(err)
  {
    char errorText[256];
    mciGetErrorString(err, errorText, 256);
    printf("%s", errorText); // jenachdem
  }
} 

BOOL DoCloseCdRom(void) 
{ 
  char chrRc[256];
  MCIERROR err;
  err = mciSendString("Set CDAudio Door Closed",chrRc,256,NULL); 
  if(err)
  {
    char errorText[256];
    mciGetErrorString(err, errorText, 256);
    printf("%s", errorText); // jenachdem
  }
}

Gruss Homer
 

new era

Grünschnabel
Jetzt kommt beim compilieren immer diese Fehler meldung:

error C4716: 'DoOpenCdRom' : must return a value
error C4716: 'DoCloseCdRom' : must return a value

Was is da falsch?
 

chibisuke

Erfahrenes Mitglied
da fehlen die beiden return anweisungen

so sollte es dann passen:
Code:
BOOL DoOpenCdRom(void) 
{ 
  char chrRc[256]; 
  MCIERROR err;
  err = mciSendString("Set CDAudio Door Open",chrRc,256,NULL); 
  if(err)
  {
    char errorText[256];
    mciGetErrorString(err, errorText, 256);
    MessageBox(NULL, errorText, "Fehler!", MB_OK); // jenachdem
  }
  return err;
} 

BOOL DoCloseCdRom(void) 
{ 
  char chrRc[256];
  MCIERROR err;
  err = mciSendString("Set CDAudio Door Closed",chrRc,256,NULL); 
  if(err)
  {
    char errorText[256];
    mciGetErrorString(err, errorText, 256);
    MessageBox(NULL, errorText, "Fehler!", MB_OK); // jenachdem
  }
  return err;
}

Ich hab hier außerdem noch das printf gegen ein MessageBox ausgetauscht, da ja niemand von uns hier weiß ob es sich um ein konsolen programm handelt oder um ein windows progy, und da ich letzteres vermute würde printf nicht alzu viel bringen außer eventuell einem 0xC0000005
 
Zuletzt bearbeitet:

Daniel Toplak

Erfahrenes Mitglied
da fehlen die beiden return anweisungen
Sorry mein Fehler, hab ich vergessen. Ich hab das nicht ausprobiert nur mal eben hier reingetippt.
(Aus der MSDN abgeschrieben :) )
Bei dem "printf" hab ich ja auch einen Komentar hingeschrieben, da ich nicht weiß ob es ein Konsolenprogramm oder GUI-Programm ist.

Gruss Homer