Thread overview
Declaring Win32 functions
Aug 04, 2004
Garett Bass
Aug 04, 2004
Matthew
Aug 04, 2004
Garett Bass
Aug 04, 2004
Walter
Aug 04, 2004
Garett Bass
Aug 14, 2004
Ilya Minkov
Aug 04, 2004
Matthew
Aug 04, 2004
Garett Bass
Aug 04, 2004
J C Calvarese
Aug 04, 2004
Matthew
August 04, 2004
I'm extending the "winsamp.d" sample, and I'm trying to call some GDI functions that are not included in std.c.windows.  I'm hesitant to modify std.c.windows, since my modifications will then need to be manually perpetuated through future versions of dmd.  How can I declare an external Win32 GDI function within "winsamp.d" itself?

Specifically I'm trying to call the GDI function "GetTextExtentPoint32", which appears in MSDN as follows:

    BOOL GetTextExtentPoint32(
        HDC hdc,           // handle to DC
        LPCTSTR lpString,  // text string
        int cbString,      // characters in string
        LPSIZE lpSize      // string size
    );

Following the example set out in std.c.windows, I declared the following in "winsamp.d":

    extern(Windows)
    {
        struct SIZE
        {
            LONG cx;
            LONG cy;
        }
        alias SIZE* PSIZE, LPSIZE;
        export BOOL GetTextExtentPoint32(HDC, LPCSTR, int, LPSIZE);
    }

However, when I compile the application, I get the following error message:

    winsamp.obj(winsamp)
     Error 42: Symbol Undefined _GetTextExtentPoint32@16
    --- errorlevel 1

Any help would be greatly appreciated.

Regards,
Garett


August 04, 2004
Are you linking in user32.lib?

"Garett Bass" <gtbass@studiotekne.com> wrote in message news:ceptge$1vho$1@digitaldaemon.com...
> I'm extending the "winsamp.d" sample, and I'm trying to call some GDI functions that are not included in std.c.windows.  I'm hesitant to modify std.c.windows, since my modifications will then need to be manually perpetuated through future versions of dmd.  How can I declare an external Win32 GDI function within "winsamp.d" itself?
>
> Specifically I'm trying to call the GDI function "GetTextExtentPoint32", which appears in MSDN as follows:
>
>     BOOL GetTextExtentPoint32(
>         HDC hdc,           // handle to DC
>         LPCTSTR lpString,  // text string
>         int cbString,      // characters in string
>         LPSIZE lpSize      // string size
>     );
>
> Following the example set out in std.c.windows, I declared the following in "winsamp.d":
>
>     extern(Windows)
>     {
>         struct SIZE
>         {
>             LONG cx;
>             LONG cy;
>         }
>         alias SIZE* PSIZE, LPSIZE;
>         export BOOL GetTextExtentPoint32(HDC, LPCSTR, int, LPSIZE);
>     }
>
> However, when I compile the application, I get the following error message:
>
>     winsamp.obj(winsamp)
>      Error 42: Symbol Undefined _GetTextExtentPoint32@16
>     --- errorlevel 1
>
> Any help would be greatly appreciated.
>
> Regards,
> Garett
>
>


August 04, 2004
Matthew wrote:
> Are you linking in user32.lib?

Thanks for your swift response.  MSDN states that GetTextExtentPoint32 is defined accessed through gdi32.lib, so I'm not sure how user32.lib is indicated in this situation.  I was not explicity linking to user32.lib. However, I get the impression that user32.lib was being linked automatically by dmd:

    D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd winsamp.d gdi32.lib
winsamp.def
    D:\Code\Compilers\D\dmd\bin\..\..\dm\bin\link.exe
winsamp,,,gdi32.lib+user32+ker
    nel32,winsamp.def/noi;
    OPTLINK (R) for Win32  Release 7.50B1
    Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved

    winsamp.obj(winsamp)
     Error 42: Symbol Undefined _GetTextExtentPoint32@16
    --- errorlevel 1

Unfortunately, adding user32.lib to the dmd command line, as follows, produces the same error:

    D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd winsamp.d gdi32.lib
user32.lib win
    samp.def
    D:\Code\Compilers\D\dmd\bin\..\..\dm\bin\link.exe
winsamp,,,gdi32.lib+user32.lib
    +user32+kernel32,winsamp.def/noi;
    OPTLINK (R) for Win32  Release 7.50B1
    Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved

    winsamp.obj(winsamp)
     Error 42: Symbol Undefined _GetTextExtentPoint32@16
    --- errorlevel 1



August 04, 2004
"Garett Bass" <gtbass@studiotekne.com> wrote in message news:cepuck$1vs1$1@digitaldaemon.com...
> Matthew wrote:
> > Are you linking in user32.lib?
>
> Thanks for your swift response.  MSDN states that GetTextExtentPoint32 is defined accessed through gdi32.lib, so I'm not sure how user32.lib is indicated in this situation.  I was not explicity linking to user32.lib. However, I get the impression that user32.lib was being linked
automatically
> by dmd:
>
>     D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd winsamp.d gdi32.lib
> winsamp.def

As in the example, you need to explicitly specify gdi32.lib on the command line.


August 04, 2004
Gah! I meant gdi32. Sorry for the misdirection.

"Garett Bass" <gtbass@studiotekne.com> wrote in message news:cepuck$1vs1$1@digitaldaemon.com...
> Matthew wrote:
> > Are you linking in user32.lib?
>
> Thanks for your swift response.  MSDN states that GetTextExtentPoint32 is defined accessed through gdi32.lib, so I'm not sure how user32.lib is indicated in this situation.  I was not explicity linking to user32.lib. However, I get the impression that user32.lib was being linked automatically by dmd:
>
>     D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd winsamp.d gdi32.lib
> winsamp.def
>     D:\Code\Compilers\D\dmd\bin\..\..\dm\bin\link.exe
> winsamp,,,gdi32.lib+user32+ker
>     nel32,winsamp.def/noi;
>     OPTLINK (R) for Win32  Release 7.50B1
>     Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved
>
>     winsamp.obj(winsamp)
>      Error 42: Symbol Undefined _GetTextExtentPoint32@16
>     --- errorlevel 1
>
> Unfortunately, adding user32.lib to the dmd command line, as follows, produces the same error:
>
>     D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd winsamp.d gdi32.lib
> user32.lib win
>     samp.def
>     D:\Code\Compilers\D\dmd\bin\..\..\dm\bin\link.exe
> winsamp,,,gdi32.lib+user32.lib
>     +user32+kernel32,winsamp.def/noi;
>     OPTLINK (R) for Win32  Release 7.50B1
>     Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved
>
>     winsamp.obj(winsamp)
>      Error 42: Symbol Undefined _GetTextExtentPoint32@16
>     --- errorlevel 1
>
>
>


August 04, 2004
> > > Garett Bass wrote: D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd winsamp.d gdi32.lib winsamp.def

> > Matthew wrote:
> > Are you linking in user32.lib?

> Walter wrote:
> As in the example, you need to explicitly specify gdi32.lib
> on the command line.

Gentlemen, please excuse me if I've not been clear about my problem, but none of your responses have directly addressed the issue of my original question.  Please look closely at my command line, and you will see that I am explicitly linking to gdi32.lib.  The problem, in my case, is how to *declare* Win32 functions that are not exposed by std.c.windows so that I may use them in my extensions to the sample.

Specifically I'm trying to call the GDI function "GetTextExtentPoint32", which appears in MSDN as follows:

    BOOL GetTextExtentPoint32(
        HDC hdc,           // handle to DC
        LPCTSTR lpString,  // text string
        int cbString,      // characters in string
        LPSIZE lpSize      // string size
    );

Following the example set out in std.c.windows, I declared the following directly within "winsamp.d":

    extern(Windows)
    {
        struct SIZE
        {
            LONG cx;
            LONG cy;
        }
        alias SIZE* PSIZE, LPSIZE;
        export BOOL GetTextExtentPoint32(HDC, LPCSTR, int, LPSIZE);
    }

However, when I compile the application -- and please notice here I am explicitly linking with gdi32.lib -- I get the following error message:

    D:\Code\Compilers\D\dmd\samples\d\winsamp>dmd
    winsamp.d gdi32.lib winsamp.def
    ...
    winsamp.obj(winsamp)
     Error 42: Symbol Undefined _GetTextExtentPoint32@16
    --- errorlevel 1


August 04, 2004
Resolution:

    For the sake of those who may struggle with this in the future, the
solution was simple.  It is, in fact, GetTextExtentPoint32A -- notice the
"A" at the end -- not GetTextExtentPoint32 that is exported by gdi32.lib.
I'll have to look in the header files rather than the documentation in the
future.  In this case, I simply openned gdi32.lib in a text editor and
searched for "GetTextExtentPoint32".  Quite handy.

Best Regards,
Garett


August 04, 2004
In article <ceqp7f$2n9f$1@digitaldaemon.com>, Garett Bass says...
>
>Resolution:
>
>    For the sake of those who may struggle with this in the future, the
>solution was simple.  It is, in fact, GetTextExtentPoint32A -- notice the "A" at the end -- not GetTextExtentPoint32 that is exported by gdi32.lib. I'll have to look in the header files rather than the documentation in the future.  In this case, I simply openned gdi32.lib in a text editor and searched for "GetTextExtentPoint32".  Quite handy.
>
>Best Regards,
>Garett

It sounds like what you're doing works, but it might be easier to pick up where someone else left off. There are a couple projects to port the Windows header files to D:

Mike Wynn:
http://dsource.org/projects/core32/
http://www.geocities.com/one_mad_alien/dcom_not_dcom.html

The page is Japanese, but the port is good (and in English): http://hp.vector.co.jp/authors/VA028375/d/windows.h.html

Also, you might find it helpful to get Microsoft's Platform SDK, but I can't remember the specific URL (and I think you might need to use Windows Update to download it -- yuck!).

jcc7
August 04, 2004
"J C Calvarese" <jcc7@cox.net> wrote in message news:ceqss3$2ula$1@digitaldaemon.com...
> In article <ceqp7f$2n9f$1@digitaldaemon.com>, Garett Bass says...
> >
> >Resolution:
> >
> >    For the sake of those who may struggle with this in the future, the
> >solution was simple.  It is, in fact, GetTextExtentPoint32A -- notice the "A" at the end -- not GetTextExtentPoint32 that is exported by gdi32.lib. I'll have to look in the header files rather than the documentation in the future.  In this case, I simply openned gdi32.lib in a text editor and searched for "GetTextExtentPoint32".  Quite handy.
> >
> >Best Regards,
> >Garett
>
> It sounds like what you're doing works, but it might be easier to pick up where someone else left off. There are a couple projects to port the Windows header files to D:
>
> Mike Wynn:
> http://dsource.org/projects/core32/
> http://www.geocities.com/one_mad_alien/dcom_not_dcom.html
>
> The page is Japanese, but the port is good (and in English): http://hp.vector.co.jp/authors/VA028375/d/windows.h.html
>
> Also, you might find it helpful to get Microsoft's Platform SDK, but I can't remember the specific URL (and I think you might need to use Windows Update to download it -- yuck!).

You don't.

IIRC, it's the Feb 2003 PSDK. I found the site a couple of weeks ago to get the latest update, but it's still Feb 03, so I didn't need to.




August 14, 2004
Garett Bass schrieb:

MSDN has been lying. :) The function you are trying to use does not exist.

> Following the example set out in std.c.windows, I declared the following
> directly within "winsamp.d":
> 
>     extern(Windows)
>     {
>         struct SIZE
>         {
>             LONG cx;
>             LONG cy;
>         }
>         alias SIZE* PSIZE, LPSIZE;
         //export BOOL GetTextExtentPoint32(HDC, LPCSTR, int, LPSIZE);
         export BOOL GetTextExtentPoint32A(HDC, LPCSTR, int, LPSIZE);
         export BOOL GetTextExtentPoint32W(HDC, LPCSTR, int, LPSIZE);
>     }

alias GetTextExtentPoint32A GetTextExtentPoint32;

All windows functions are defined as either ASCII or Widechar(Unicode) versions, or both. The MSDN names are created in the header files by the preprocessor, or aliases in D.

You must be careful because if the functions accept structs, these can have the same layout but different underlying types for unicode and ASCII versions. Better you use a more complete translation of windows headers already available.

Do some text search in the LIB files if you have any linking problems, it can be of much help.

-eye