[c++] Po wykonaniu GetOpenFileName nie działa Copyfile,_findfirst

0

Pisze program w Winapi i mam pewien problem nad którym spędziłem kilka godzin i nic nie wymyśliłem.
Zamieszczam przykładowy kod który obrazuje.Kod jest pod Devc++:

 
 #include <windows.h>
/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND select_file;
HWND e_sfi ;
/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hWnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hWnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hWnd, nFunsterStil);
 e_sfi = CreateWindowEx(WS_EX_CLIENTEDGE,"edit", "", WS_CHILD | WS_VISIBLE|ES_AUTOHSCROLL, 120, 70, 100, 20, hWnd, NULL, hThisInstance, NULL);
    select_file = CreateWindow("button","Wybierz", WS_CHILD | WS_VISIBLE, 10,100, 80, 20, hWnd, NULL, hThisInstance, NULL);
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
            case WM_COMMAND:
                 if((HWND)lParam == select_file)
		{

			//////////////////////////////

			TCHAR szFile[4000];

		OPENFILENAME ofn;
	
		
		// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not 
// use the contents of szFile to initialize itself.
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = NULL;
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


	
		if(GetOpenFileName(&ofn))
		{
		
		}
		CopyFile("ReadMe.txt","n/ReadMe.txt",false);



		} 
                 break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

To samo dzieje się w Visual C++ 2010
Problem polega na tym, że naciskam sobie przycisk, aby wybrać plik.
Otwiera się okienko do szukania plików i teraz mam dwie możliwości mogę nacisnąć Otwórz lub anuluj.
Jeśli wybiorę otwórz to okienko się zamknie, ale funkcja CopyFile nie działa podobnie jak inne działające na plikach.Nawet usiłowałem wykorzystać C do kopiowania plików to tam wywala mi błąd przy takiej funkcji:fseek(p_zrodlowy, 0, SEEK_END);. Ale najdziwniejsze jest to, że gdy za pierwszym razem nie nacisnę Otwórz tylko Anuluj to funkcja zadziała.Ale gdy wybiorę za pierwszym razem otwórz to kolejne otwieranie okienka i wybieranie Anuluj nic nie daje, żeby ta funkcja zadziałała musi być świeżo otwarty program.
I teraz moje pytanie gdzie jest błąd? W definicji struktury OPENFILENAME? Ta jest skopiowana z przykładu z msdn.
Zależy mi tylko żeby działało kopiowanie plików nieważne jakim sposobem.

Nawet tak banalna funkcja użyta zamiast CopyFile ma ten sam problem:

void kopiuj(string &xrodlo,string &cel)
{
  char * buffer;
  long size;

  ifstream infile (xrodlo.c_str(),ifstream::binary);
  ofstream outfile (cel.c_str(),ofstream::binary);

  // get size of file
  infile.seekg(0,ifstream::end);
  size=infile.tellg();
  infile.seekg(0);

  // allocate memory for file content
  buffer = new char [size];

  // read content of infile
  infile.read (buffer,size);

  // write to outfile
  outfile.write (buffer,size);
  
  // release dynamically-allocated memory
  delete[] buffer;

  outfile.close();
  infile.close();

     
} 
1

Naucz się używać ścieżek bezwzględnych, GetOpenFileName zmienia current directory.

0

Wielkie dzięki. Wcześniej nawet nie miałem o tym pojęcia, że ścieżka względna może być zmieniona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1