David wrote:
> Hej lige to spørgsmål jeg brænder inde med.
> 1. Jeg skal foretage en simpel io opereation i visual c hvor jeg bare skal
> læse fra en fil og vise det i en meddelsesboks. Hvorfor virker dette ikke?
> HANDLE hf;
>
> hf=CreateFile("loi.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NOR
> MAL,NULL);
> UINT ui=150;
> ReadFile(hf,&buffer,strlen(buffer),&ui,NULL)
> MessageBox(hWnd, buffer, "Info", MB_OK);
> 2. Hvordan finder jeg ud af om en streng(af typen PSTR) er tom. Jeg skal
> bruge det til at finde ud af om programmet bliver åbnet uden parametre.
> Hilsen David.
1.)
Du viser ikke hvordan buffer er deklareret men du læser strlen(buffer) bytes ind
i buffer. Det ville give pragtfuld mening hvis du kaldte WriteFile. Man må da gå
ud fra at buffer enten er tom eller at begyndelses-længden for buffer ingenting
har at gøre med hvor meget du vil læse fra filen... Prøv at skrive
strlen(buffer) ud til konsollen el.lign. Ydermere, hvis du kigger i online help
vil du se at ReadFile's 4. parameter er en output parameter, ikke en input
parameter. Så at sætte ui = 150 giver ikke mening, jvf. MSDN:
lpNumberOfBytesRead
[out] Pointer to the number of bytes read. ReadFile sets this value to zero
before doing any work or error checking.
------------------------------------------------------------------------------------------------------------------------------------------------
#include <windows.h>
int main() {
HANDLE h;
DWORD dwBytesRead, dwFileSizeLow;
h=::CreateFile(
TEXT("D:\\TEST.TXT"),
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if(h == INVALID_HANDLE_VALUE)
{
::MessageBox(NULL, TEXT("Error opening file."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
return 1;
}
// GetFileSize is a bit tricky, see the online help. This will only work if the
file is not huge.
dwFileSizeLow = GetFileSize(h, NULL);
if(dwFileSizeLow == 0xFFFFFFFF)
{
::MessageBox(NULL, TEXT("Couldn't get file size."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
::CloseHandle(h);
return 1;
}
LPSTR lpsz = new TCHAR[dwFileSizeLow + 1];
if(!lpsz)
{
::MessageBox(NULL, TEXT("Out of memory."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
::CloseHandle(h);
return 1;
}
:: memset(lpsz, 0, sizeof(TCHAR) * (dwFileSizeLow + 1));
if(!::ReadFile(h, lpsz, dwFileSizeLow, &dwBytesRead, NULL) || dwBytesRead !=
dwFileSizeLow)
{
::MessageBox(NULL, TEXT("Error reading file."), TEXT("Error"), MB_OK |
MB_ICONSTOP);
delete [] lpsz;
::CloseHandle(h);
return 1;
}
::CloseHandle(h);
::MessageBox(NULL, lpsz, TEXT("DATA"), MB_OK);
delete [] lpsz;
return 0;
}
------------------------------------------------------------------------------------------------------------------------------------------------
2.)
I winnt.h er PSTR typedef'ed som
typedef CHAR *LPSTR, *PSTR;
Så du kan bare:
PSTR pstr = NULL;
// manipulate pstr
if( ! (pstr && lstrlen(pstr) > 0))
{
// pstr is empty
}
mvh,
S. Bro
|