| |
| Posted by Chris Nicholson-Sauls in reply to Karl Bochert | PermalinkReply |
|
Chris Nicholson-Sauls
Posted in reply to Karl Bochert
| Karl Bochert wrote:
> I have been attempting to access the windows api from D, and there seem to be
> api calls missing from std.windows.windows.
>
> I have added to phobos:
> export HANDLE GetStdHandle(DWORD dev);
> export DWORD GetConsoleTitle(LPSTR buf, DWORD len);
> export BOOL AllocConsole();
>
> but when I compile a program using them, I get from the linker:
> winapp.obj(winapp)
> Error 42: Symbol Undefined _GetConsoleTitle@8
>
> Why does GetConsoleTitle() fail when the other 2 don't??
>
>
Simple. Because there is no such function as GetConsoleTitle(). There are, however, both GetConsoleTitleA() for ANSI and GetConsoleTitleW() for Unicode. This is a common implementation detail throughout the Win32 API. In C/C++ there is a macro defined for each such function as the base name without the ANSI/Unicode suffix, as nothing more than a transparent wrap to one of the implementations.
Something like:
[code]
void SomeFuncA(HANDLE, LPSTR);
void SomeFuncW(HANDLE, LPWSTR);
#ifdef _UNICODE_
#define SomeFunc(_A, _B) SomeFuncW(_A, _B)
#else
#define SomeFunc(_A, _B) SomeFuncA(_A, _B)
#endif
[/code]
Simply change your additions to the following:
# export { extern (Windows) {
# BOOL AllocConsole ( ) ;
# DWORD GetConsoleTitleA (LPSTR, DWORD) ;
# HANDLE GetStdHandle (DWORD ) ;
# }}
Note that you don't neccessarily need the 'export' attribute -- so far as I am aware anyhow -- and also that you don't have to add these to Phobos. Instead, you may declare them in an import module in your own project.
-- Chris Nicholson-Sauls
|