Thread overview
DMD 0.69 Bug - CreateFileA
Aug 16, 2003
J C Calvarese
Aug 16, 2003
Mike Wynn
Aug 16, 2003
Walter
Aug 16, 2003
J C Calvarese
Aug 16, 2003
Walter
Aug 16, 2003
Philippe Mori
August 16, 2003
The compiler is telling me that the arguments types don't match, but as far as I can tell they do match -- exactly.  I've had similar problems in the past with earlier releases of DMD.  I think I solved them by overriding the prototype in windows.d (perhaps with "HANDLE CreateFileA(LPCSTR, DWORD, DWORD, UINT, DWORD, DWORD, HANDLE);"), but I can't see why that would be necessary.  I cast my code until the types I send are precisely what the prototype desires, and the compiler is still unsatisfied.  I'm trying to compile on WindowsME with DMD 0.69.


function CreateFileA (
char*lpFileName,
uint dwDesiredAccess,
uint dwShareMode,
SECURITY_ATTRIBUTES *lpSecurityAttributes,
uint dwCreationDisposition,
uint dwFlagsAndAttributes,
HANDLE hTemplateFile)
does not match argument types
(char*,uint,uint,SECURITY_ATTRIBUTES ,uint,uint,HANDLE )


Thanks for any help you can provide.

Justin


Here's the offending code...


import string;
import stream;
import windows;

int main(char[][] Args)
{
    int i, j;
    char[] fn = Args[1];
    bit ret;
    char* lpFileName = cast(char*) (fn ~ \0);

    HANDLE hFile = CreateFileA(lpFileName, GENERIC_WRITE, cast(uint) (FILE_SHARE_READ || FILE_SHARE_WRITE), cast(SECURITY_ATTRIBUTES) 0, cast(uint) OPEN_EXISTING, cast(uint) 0, cast(HANDLE) 0);

    return 0;
}

August 16, 2003
"J C Calvarese" <jcc7@cox.net> wrote in message news:bhlqv0$2rg0$1@digitaldaemon.com...
> The compiler is telling me that the arguments types don't match, but as far as I can tell they do match -- exactly.  I've had similar problems in the past with earlier releases of DMD.  I think I solved them by overriding the prototype in windows.d (perhaps with "HANDLE CreateFileA(LPCSTR, DWORD, DWORD, UINT, DWORD, DWORD, HANDLE);"), but I can't see why that would be necessary.  I cast my code until the types I send are precisely what the prototype desires, and the compiler is still unsatisfied.  I'm trying to compile on WindowsME with DMD 0.69.
>
>
> function CreateFileA (
> char*lpFileName,
> uint dwDesiredAccess,
> uint dwShareMode,
> SECURITY_ATTRIBUTES *lpSecurityAttributes,
^^ NOTE THIS LINE
> uint dwCreationDisposition,
> uint dwFlagsAndAttributes,
> HANDLE hTemplateFile)
> does not match argument types
> (char*,uint,uint,SECURITY_ATTRIBUTES ,uint,uint,HANDLE )
                                  ^^ see anything yet ?
>
>
> Thanks for any help you can provide.
>
> Justin
>
>
> Here's the offending code...
>
>
> import string;
> import stream;
> import windows;
>
> int main(char[][] Args)
> {
>      int i, j;
>      char[] fn = Args[1];
>      bit ret;
>      char* lpFileName = cast(char*) (fn ~ \0);
>
>      HANDLE hFile = CreateFileA(lpFileName, GENERIC_WRITE, cast(uint)
> (FILE_SHARE_READ || FILE_SHARE_WRITE), cast(SECURITY_ATTRIBUTES) 0,
should be `null`, cast(SECURITY_ATTRIBUTES*)null, or
cast(SECURITY_ATTRIBUTES*)0
// you've missed the `*`
> cast(uint) OPEN_EXISTING, cast(uint) 0, cast(HANDLE) 0);
>
>      return 0;
> }
>


August 16, 2003
Change:

    cast(SECURITY_ATTRIBUTES) 0

to:

    cast (SECURITY_ATTRIBUTES*) 0

"J C Calvarese" <jcc7@cox.net> wrote in message news:bhlqv0$2rg0$1@digitaldaemon.com...
> The compiler is telling me that the arguments types don't match, but as far as I can tell they do match -- exactly.  I've had similar problems in the past with earlier releases of DMD.  I think I solved them by overriding the prototype in windows.d (perhaps with "HANDLE CreateFileA(LPCSTR, DWORD, DWORD, UINT, DWORD, DWORD, HANDLE);"), but I can't see why that would be necessary.  I cast my code until the types I send are precisely what the prototype desires, and the compiler is still unsatisfied.  I'm trying to compile on WindowsME with DMD 0.69.
>
>
> function CreateFileA (
> char*lpFileName,
> uint dwDesiredAccess,
> uint dwShareMode,
> SECURITY_ATTRIBUTES *lpSecurityAttributes,
> uint dwCreationDisposition,
> uint dwFlagsAndAttributes,
> HANDLE hTemplateFile)
> does not match argument types
> (char*,uint,uint,SECURITY_ATTRIBUTES ,uint,uint,HANDLE )
>
>
> Thanks for any help you can provide.
>
> Justin
>
>
> Here's the offending code...
>
>
> import string;
> import stream;
> import windows;
>
> int main(char[][] Args)
> {
>      int i, j;
>      char[] fn = Args[1];
>      bit ret;
>      char* lpFileName = cast(char*) (fn ~ \0);
>
>      HANDLE hFile = CreateFileA(lpFileName, GENERIC_WRITE, cast(uint)
> (FILE_SHARE_READ || FILE_SHARE_WRITE), cast(SECURITY_ATTRIBUTES) 0,
> cast(uint) OPEN_EXISTING, cast(uint) 0, cast(HANDLE) 0);
>
>      return 0;
> }
>


August 16, 2003
Thanks a bunch.  (Don't I feel stupid?)  That fixed my problem.

Walter wrote:
> Change:
> 
>     cast(SECURITY_ATTRIBUTES) 0
> 
> to:
> 
>     cast (SECURITY_ATTRIBUTES*) 0
> 

August 16, 2003
IMO we should be able to pass null keyword for a null pointer without any cast...

In C++, it was an error that 0 and NULL are equivalent. Although we can
support 0 to initialize a pointer, a nill constant that would be assignable
only
to pointer would be better and would help avoid ambiguities (0 would always
match integral if possible)

and if we like documenting null parameters, we could then declare a null constant of the proper type (nil_security_attributes).


"Walter" <walter@digitalmars.com> a écrit dans le message de news:bhlvvb$3102$1@digitaldaemon.com...
> Change:
>
>     cast(SECURITY_ATTRIBUTES) 0
>
> to:
>
>     cast (SECURITY_ATTRIBUTES*) 0
>
> "J C Calvarese" <jcc7@cox.net> wrote in message news:bhlqv0$2rg0$1@digitaldaemon.com...
> > The compiler is telling me that the arguments types don't match, but as far as I can tell they do match -- exactly.  I've had similar problems in the past with earlier releases of DMD.  I think I solved them by overriding the prototype in windows.d (perhaps with "HANDLE CreateFileA(LPCSTR, DWORD, DWORD, UINT, DWORD, DWORD, HANDLE);"), but I can't see why that would be necessary.  I cast my code until the types I send are precisely what the prototype desires, and the compiler is still unsatisfied.  I'm trying to compile on WindowsME with DMD 0.69.
> >
> >
> > function CreateFileA (
> > char*lpFileName,
> > uint dwDesiredAccess,
> > uint dwShareMode,
> > SECURITY_ATTRIBUTES *lpSecurityAttributes,
> > uint dwCreationDisposition,
> > uint dwFlagsAndAttributes,
> > HANDLE hTemplateFile)
> > does not match argument types
> > (char*,uint,uint,SECURITY_ATTRIBUTES ,uint,uint,HANDLE )
> >
> >
> > Thanks for any help you can provide.
> >
> > Justin
> >
> >
> > Here's the offending code...
> >
> >
> > import string;
> > import stream;
> > import windows;
> >
> > int main(char[][] Args)
> > {
> >      int i, j;
> >      char[] fn = Args[1];
> >      bit ret;
> >      char* lpFileName = cast(char*) (fn ~ \0);
> >
> >      HANDLE hFile = CreateFileA(lpFileName, GENERIC_WRITE, cast(uint)
> > (FILE_SHARE_READ || FILE_SHARE_WRITE), cast(SECURITY_ATTRIBUTES) 0,
> > cast(uint) OPEN_EXISTING, cast(uint) 0, cast(HANDLE) 0);
> >
> >      return 0;
> > }
> >
>
>


August 16, 2003
You shouldn't feel stupid. The error message spit out by the compiler was inadequate, and is what is to blame here.

"J C Calvarese" <jcc7@cox.net> wrote in message news:bhm60h$7vh$1@digitaldaemon.com...
> Thanks a bunch.  (Don't I feel stupid?)  That fixed my problem.
>
> Walter wrote:
> > Change:
> >
> >     cast(SECURITY_ATTRIBUTES) 0
> >
> > to:
> >
> >     cast (SECURITY_ATTRIBUTES*) 0
> >
>