Проблема с каталогами и селектором файлов (VC ++ 2008) - PullRequest
0 голосов
/ 06 августа 2009

Я реализовал селектор файлов с помощью выпадающего списка. Я хочу записать выбранное имя файла в журнал. Проблема в том, что когда я выбираю файл из исходного каталога, он идет хорошо, но когда я выбираю файл из другого каталога, он не работает. Кто-нибудь может помочь с этим? Вот код для селектора файлов, он внутри диалога.

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;
}

Это 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);
}

и, наконец, именно здесь я записываю имя файла в файл.

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);
    }
}

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 августа 2009

Из документации для DlgDirListComboBox:

Если lpPathSpec указывает каталог, DlgDirListComboBox меняет текущий каталог в указанный каталог перед заполнением поля со списком. Текст статического контроля, идентифицируемого параметр nIDStaticPath установлен в имя нового текущего каталога.

Возможно, вы хотите кэшировать текущий каталог (GetCurrentDirectory) перед вызовом DlgDirSelectComboBoxEx, а затем вернуть его обратно после возврата. Или не вызывайте fopen с относительным каталогом.

0 голосов
/ 17 августа 2009

Проблема в том, что файл не открывается? Если это так, я подозреваю, что текущий каталог изменяется в диалоговом окне выбора файла, и поэтому новый каталог не содержит каталога с именем conf.

Вы можете попытаться указать абсолютный путь для conf \ Baterias.conf, чтобы подтвердить, что это проблема.

...