D para Win32
Esse capítulo descreve a implementação de D para sistemas Windows de 32 bits. Naturalmente, características específicas do Windows não são portáveis para outras plataformas.
Ao invés do:
#include <windows.h>do C, em D existe o:
import std.c.windows.windows;
Convenções de Chamada
Em C, as convenções de chamada da API do Windows são __stdcall. em D, é simplesmente:
extern(Windows)
{
/* ... declarações da função ... */
}
O atributo de ligação Windows ajusta a convenção de chamada e o esquema de nomes para serem compatíveis com Windows.
Para funções que em C seriam __declspec(dllimport) ou __declspec(dllexport), use o atributo de exportação:
export void func(int foo);
Se nenhum corpo é dado, a função é importada. Se um corpo é dado, ela é exportada.
Executáveis do Windows
Aplicações GUI do Windows podem ser escritas em D. Um exemplo disso pode ser encontrado em \dmd\samples\d\winsamp.d
Isso é necessário:
- Ao invés de uma função main servindo como ponde de entrada, uma função WinMain é necessária.
- WinMain deve ter a seguinte forma:
A função myWinMain() é onde o código usuário vai, o resto de WinMain usado para inicializar e derrubar o sistema de execução de D.import std.c.windows.windows; extern(C) void gc_init(); extern(C) void gc_term(); extern(C) void _minit(); extern(C) void _moduleCtor(); extern(C) void _moduleDtor(); extern(C) void _moduleUnitTests(); extern(Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int result; gc_init(); // Inicializa o coletor de lixo _minit(); // inicializa tabela de construtor de módulo try { _moduleCtor(); // chama construtores do módulo _moduleUnitTests(); // executa testes de unidade (opcional) result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow); _moduleDtor(); // chama destrutores do módulo } catch(Object o) // captura qualquer exceção não capturada { MessageBoxA(null, cast(char*)o.toString(), "Error", MB_OK | MB_ICONEXCLAMATION); result = 0; // falhou } gc_term(); // executa finalizadores; termina o coletor de lixo return result; } int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { /* ... insira código usuário aqui ... */ }
- Um (Arquivo de Definição de Módulo)
com ao menos as seguintes duas linhas nele:
EXETYPE NT SUBSYSTEM WINDOWS
Sem elas, Win32 abrirá uma janela de console quando a aplicação for executada. - A presença de WinMain() é reconhecida pelo compilador, fazendo-o emitir uma referência para __acrtused_dll e a biblioteca phobos.lib.
Page generated by Ddoc on Tue Feb 20 17:48:01 2007