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&ccedil;&otilde;es da fun&ccedil;&atilde;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:

  1. Ao invés de uma função main servindo como ponde de entrada, uma função WinMain é necessária.
  2. WinMain deve ter a seguinte forma:
    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&oacute;dulo
    
    	try
    	{
    		_moduleCtor(); // chama construtores do m&oacute;dulo
    		_moduleUnitTests(); // executa testes de unidade (opcional)
    
    		result = myWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    
    		_moduleDtor(); // chama destrutores do m&oacute;dulo
    	}
    	catch(Object o) // captura qualquer exce&ccedil;&atilde;o n&atilde;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&oacute;digo usu&aacute;rio aqui ... */
    }
    
    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.
  3. 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.
  4. 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