Avatar billede bumle90 Nybegynder
08. januar 2004 - 21:38 Der er 41 kommentarer og
1 løsning

Nybegynder i windows APIen

Hejsa. Jeg er lige gået i gang med at bruge windows APIen.
Jeg kan godt programmere i forevejen, og kender til de forskellige begreber.
Jeg har dog ikke rodet med Windows APIen før, og kunne godt tænke mig at lave et program der kan kigge alle filer igennem på et givet drev.
Jeg ved dog ikke lige hvor jeg skal tage fat.
Er der evt. en der lige har lyst til at hjælpe mig lidt igang ? :)
Avatar billede arne_v Ekspert
08. januar 2004 - 21:45 #1
Et ekstremt simpelt eksempel som ihvertfald giver dig 2 interessante
funktioner at slå op:

#include <stdio.h>

#include <windows.h>

int main()
{
  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile("*.c",&data);
  if(h!=NULL) {
    printf("%s %d %d\n",data.cFileName,data.nFileSizeHigh,data.nFileSizeLow);
    while(FindNextFile(h,&data)) {
        printf("%s %d %d\n",data.cFileName,data.nFileSizeHigh,data.nFileSizeLow);
    }
  }
  FindClose(h);
  return 0;
}
Avatar billede bumle90 Nybegynder
08. januar 2004 - 21:49 #2
hej Arne
Jeg har kompileret koden og kørt den.(Skal lige siges jeg har FAT32 filsystem)
Når jeg kører koden får jeg følgende output
&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;
&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;
&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;
&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9568;&#9492; &#8597; -858993460 -858993460
Avatar billede bumle90 Nybegynder
08. januar 2004 - 21:49 #3
Vist som en masse rammer...Som i DOS
Avatar billede arne_v Ekspert
08. januar 2004 - 22:13 #4
Hvilken compiler ?
Avatar billede coldplay Nybegynder
08. januar 2004 - 22:44 #5
#include <winbase.h>
Avatar billede bumle90 Nybegynder
08. januar 2004 - 22:55 #6
Det er i visual c++ 6.0
Avatar billede bumle90 Nybegynder
08. januar 2004 - 22:57 #7
Det hjælper ikke at #include <winbase.h>
Den viser samme rammer
Avatar billede arne_v Ekspert
08. januar 2004 - 22:58 #8
windows.h inkluderer winbase.h, så det er ikke overraskende at det ikke
løser problemet.
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:00 #9
ahhh hehe :)
Kan det være fordi jeg har FAT32 ?
Avatar billede arne_v Ekspert
08. januar 2004 - 23:00 #10
Noget mystisk, fordi jeg bruger nemlig også VC++ 6
Avatar billede arne_v Ekspert
08. januar 2004 - 23:00 #11
Jeg tester ganske vist på NTFS, men det burde altså ikke gøre nogen
stor forskel.
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:04 #12
Du har ikke en FAT32 partition el. HD ?
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:07 #13
Arne_v dette er kode fra MSDN. Kan du ikke lige prøve at køre det og se hvad du får ?

P.S. Jeg har selv oprettet path. Oprindeligt tager programmet argv som parameter.

Side kode er hentet fra
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/findfirstfile.asp

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  WIN32_FIND_DATA FindFileData;
  HANDLE hFind;
  char *path;
  path="c:";
  //printf ("Target file is %s.\n", argv[1]);
  hFind = FindFirstFileEx(path, FindExInfoStandard, &FindFileData,
                FindExSearchNameMatch, NULL, 0 );

  if (hFind == INVALID_HANDLE_VALUE)
  {
    printf ("Invalid File Handle. GetLastError reports %d\n", GetLastError ());
    return (0);
  }
  else
  {
    printf ("The first file found is %s\n%s\n%s\n", FindFileData.cFileName, FindFileData.cAlternateFileName ,FindFileData.ftLastAccessTime );
    FindClose(hFind);
    return (1);
  }
}
Avatar billede arne_v Ekspert
08. januar 2004 - 23:07 #14
Jeg flyttede lige over på min laptop med FAT32 - no problem !
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:11 #15
hmmm det er meget strange...Hvad kan der så være galt?
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:13 #16
Det her er alt hvad der står i kodevinduet. Mangler der noget?

#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

int main()
{
  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile("*.c",&data);
  if(h!=NULL) {
    printf("%s %d %d\n",data.cFileName,data.nFileSizeHigh,data.nFileSizeLow);
    while(FindNextFile(h,&data)) {
        printf("%s %d %d\n",data.cFileName,data.nFileSizeHigh,data.nFileSizeLow);
    }
  }
  FindClose(h);
  return 0;
}
Avatar billede arne_v Ekspert
08. januar 2004 - 23:14 #17
Eksemplet fra MSDN virker fint hos mig.

Din kode dør med en read access violation.
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:16 #18
ja...samme her
Avatar billede arne_v Ekspert
08. januar 2004 - 23:16 #19
Hvilken type applikation vælger du når du laver projektet ?
Avatar billede acid-head Nybegynder
08. januar 2004 - 23:18 #20
Hos mig viser den samme output som hos dig, Bumle90.. Kan det være noget med OS, da jeg sidder på en Windows 98?
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:19 #21
Mmmm jeg sidder på en WinXP maskine.
Det er da virkelig mystisk så.
Kan det ha noget at gøre med en header fil, eller en opsætning i VC som vi ikke har???
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:19 #22
en DOS 32 applikation
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:20 #23
Win32 Console Application
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:23 #24
Er det korrekt?
Avatar billede arne_v Ekspert
08. januar 2004 - 23:25 #25
Ja.

Nu har jeg også kunnet genskabe problemet !
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:26 #26
oki, hvad har du gjort?
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:36 #27
er du der?
Avatar billede arne_v Ekspert
08. januar 2004 - 23:39 #28
Ja.

Men jeg er lidt mystificeret.

Jeg fik fejlen. Men nu er den væk igen.
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:41 #29
hmmm det lyder mystisk.
Kan det have noget at gøre med tilstanden i filsystemet?
Eller ændrede du noget i opsætningen i vc?
Avatar billede arne_v Ekspert
08. januar 2004 - 23:43 #30
Jeg har prøvet alt muligt.

Men jeg tror jeg har forstået det nu !
Avatar billede arne_v Ekspert
08. januar 2004 - 23:45 #31
Koden er faktisk forkert.

if(h!=NULL) {

skal være:

if(h!=INVALID_HANDLE_VALUE) {

Hvis der er nogen *.c filer, så er der ikke nogen problemer uanset hvad.

Hvis der ingen .c filer er så testet træder i kraft, så opfører VC++
sig lidt forskelligt alt efter settings.

Default settings giver masser af firkanter + 2 tal.

Ingen settings giver bare 2 tal.
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:46 #32
Hmm nu får jeg intet på skærmen
Avatar billede arne_v Ekspert
08. januar 2004 - 23:47 #33
Formentligt fordi du ikke har nogen .c filer i det directory du kører i !
Avatar billede arne_v Ekspert
08. januar 2004 - 23:47 #34
Prøv og erstat "*.c" med f.eks. "C:\\*.*"
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:48 #35
ahhh my bad
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:49 #36
Havde ingen .c filer liggende hæhæ :p
Jeg kørte koden fra en cpp fil
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:53 #37
Hvis jeg så vil udvide koden til også at tage subdirs med.
Ville jeg vel bare skulle lave et par rekursive kald, og så har man det hele ik?
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:53 #38
I princippet har jeg vel alt hvad jeg behøver der
Avatar billede arne_v Ekspert
08. januar 2004 - 23:56 #39
Ja.

Du kigger i data.dwFileAttributes og hvis FILE_ATTRIBUTE_DIRECTORY
bitten er sat så kan du recurse.
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:57 #40
Det er bare helt kanon Arne.
Tusind tak for hjælpen.
Her er alle pointene
Avatar billede bumle90 Nybegynder
08. januar 2004 - 23:58 #41
Kan du ikke lægge et svar?
Avatar billede arne_v Ekspert
09. januar 2004 - 00:00 #42
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester