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