2009-08-06 15 views
0

Ich habe einen Dateiwähler mit einer Combobox implementiert. Ich möchte den ausgewählten Dateinamen in ein Protokoll schreiben. Das Problem ist, dass wenn ich eine Datei aus dem ursprünglichen Verzeichnis auswähle, es gut geht, aber wenn ich eine Datei aus einem anderen Verzeichnis wähle, wird es nicht funktionieren. Kann mir jemand helfen? Hier ist der Code für den Dateiwähler, er befindet sich in einem Dialog.Problem mit Verzeichnissen und Dateiauswahl (VC++ 2008)

BOOL CALLBACK BateriaFaxDlg(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){ 

char descripcion[100]=""; 

char archivo[100]=""; 
char cad[100]; 

int i,l; 

switch (msg)    

    { 
     case WM_INITDIALOG: 
      InitCombo(hDlg, "*.*");   
      return TRUE; 
      break; 
     case WM_COMMAND: 
      switch(LOWORD(wParam)) { 
       case IDOK: 

        i = SendDlgItemMessage(hDlg, IDC_ARCH2, CB_GETCURSEL, 0, 0); 
        if(i >= 0) { 
         SendDlgItemMessage(hDlg, IDC_ARCH2, CB_GETLBTEXT, (WPARAM)i, (LPARAM)archivo); 
        } 

        if (!GetDlgItemText(hDlg, IDC_DESCBATER, descripcion , 100)) { 
         MessageBox(hDlg, "Ambos campos son obligatorios", "ERROR", MB_ICONEXCLAMATION | MB_OK); 
         break; 
        } 
        actualizarBaterias(GetParent(hDlg), "FAX", archivo, descripcion); 
        EndDialog(hDlg, FALSE); 
       break; 
       case IDCANCEL: 
        EndDialog(hDlg, FALSE); 
        break; 
       case IDC_ARCH2: 
        switch(HIWORD(wParam)) { 
         case CBN_CLOSEUP: 
         case CBN_KILLFOCUS: 
          if(DlgDirSelectComboBoxEx(hDlg, cad, 100, IDC_ARCH2)) { 
           strcat(cad, "*.*"); 
           InitCombo(hDlg, cad); 
          }      
         break; 
        } 
       break;   
       default: 
       break;   
      return TRUE; 
      } 
    } 


    return FALSE; 
} 

Dies ist InitCombo:

void IniciarCombo(HWND hwnd, char* p) { 

    char path[100]; 

    strcpy(path, p); 

    DlgDirListComboBox(
    hwnd,   
    path,   
    IDC_ARCH2,  
    ID_TITULO,  
    DDL_DIRECTORY | DDL_DRIVES 
    ); 
    SendDlgItemMessage(hwnd, IDC_ARCH2, CB_SETCURSEL, 0, 1); 
} 

und schließlich das ist, wo ich die Dateinamen in eine Datei schreiben.

void actualizarBaterias(HWND hWnd, char *tipo, char *archivo, char *descripcion) { 
    FILE *fp; 
    HWND hctrl; 
    int i; 
    HFONT hfont; 

    fp = fopen("conf\\Baterias.conf", "a"); 
    if (fp) { 
     MessageBox(hWnd, "Actuali","error", MB_ICONEXCLAMATION | MB_OK);          
     fprintf(fp, "\n%s %s %s", tipo, archivo, descripcion); 
     fclose(fp); 
    } 
} 

Vielen Dank im Voraus.

Antwort

0

Vom documentation für DlgDirListComboBox:

Wenn lpPathSpec ein Verzeichnis angibt, DlgDirListComboBox ändert die aktuelle Verzeichnis in das angegebene Verzeichnis bevor das Kombinationsfeld zu füllen. Der Text der statischen Steuerung, der durch der Parameter nIDStaticPath identifiziert wird, wird auf der Name des neuen aktuellen Verzeichnisses festgelegt.

Sie wollen wahrscheinlich das aktuelle Verzeichnis (GetCurrentDirectory) zwischenzuspeichern, bevor DlgDirSelectComboBoxEx Aufruf, setzen Sie ihn dann zurück, nachdem er zurückkehrt. Oder rufen Sie nicht fopen mit einem relativen Verzeichnis auf.

0

Ist das Problem, dass die Datei nicht geöffnet wird? Wenn dies der Fall ist, würde ich vermuten, dass das aktuelle Verzeichnis durch das Dateiauswahldialogfeld geändert wird, und daher enthält das neue Verzeichnis keines, das "conf" genannt wird.

Sie könnten versuchen, einen absoluten Pfad für conf \ Baterias.conf anzugeben, um zu bestätigen, dass dies das Problem ist.