Archive for the ‘Win32 API’ Category

  1. Hello, Win32 API(Quercus) World!

    Posted on 5月 3rd, 2013 by cx20

    Win32 API(Quercus)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Quercus にて SWT の非公開 API を使用した Win32 API 呼出しの例となっている。

    ソースコード

    <?php
    import org.eclipse.swt.internal.win32.OS;
    import org.eclipse.swt.internal.win32.TCHAR;
     
    $lpText = new TCHAR(0, "Hello, Win32 API World!", True);
    $lpCaption = new TCHAR(0, "Hello, World", True);
    OS::MessageBox(0, $lpText, $lpCaption, OS::MB_OK );
    ?>

    実行方法

    C:¥> java -cp org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar;resin.jar;. com.caucho.quercus.CliQuercus hello.php

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  2. Hello, Win32 API(CNI) World!

    Posted on 3月 26th, 2013 by cx20

    Win32 API(CNI)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は、GCJ にて CNI を利用した Win32 API の呼出し例となっている。

    ソースコード(Java)

    public class Hello {
        public static native int messageBox( int hwnd, String text, String caption, int type );
     
        public static void main( String[] args ) {
            messageBox( 0, "Hello, Win32 API World!

    クラスファイル作成

    C:¥> gcj -C Hello.java

    C++ ヘッダファイル作成

    C:¥> gcjh Hello.class

    ソースコード(C++ ヘッダファイル)

    // DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-
     
    #ifndef __Hello__
    #define __Hello__
     
    #pragma interface
     
    #include <java/lang/Object.h>
    #include <gcj/array.h>
     
    extern "Java"
    {
        class Hello;
    }
     
    class Hello : public ::java::lang::Object
    {
     
    public:
      Hello();
      static jint messageBox(jint, ::java::lang::String *, ::java::lang::String *, jint);
      static void main(JArray< ::java::lang::String * > *);
      static ::java::lang::Class class$;
    };
     
    #endif // __Hello__

    ソースコード(C++ 実装ファイル)

    #include <gcj/cni.h>
    #include <windows.h>
    #include "Hello.h"
     
    jint Hello::messageBox(jint hwnd, ::java::lang::String* text, ::java::lang::String* caption, jint type)
    {
        jchar* _text = JvGetStringChars( text );
        jchar* _caption = JvGetStringChars( caption );
        int result = MessageBoxW( (HWND)hwnd, (LPCWSTR)_text, (LPCWSTR)_caption, (UINT)type );
        return result;
    }

    コンパイル方法

    C:¥> gcj -c Hello.cpp
    C:¥> gcj --main=Hello -o Hello Hello.o Hello.class

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  3. Hello, Win32 API(Oxygene) World!

    Posted on 3月 20th, 2013 by cx20

    Win32 API(Oxygene)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Oxygene にて SWT の非公開 API を使用した Win32 API 呼出しの例となっている。

    ソースコード

    namespace hello;
     
    interface
    uses
        org.eclipse.swt.internal.win32.*;
     
    type
        Hello = class
    public
        class method Main(args: array of String);
    end;
     
    implementation
     
    class method Hello.Main(args: array of String);
    var
        lpText: TCHAR;
        lpCaption: TCHAR;
    begin
        lpText := new TCHAR(0, "Hello, Win32 API World!", True);
        lpCaption := new TCHAR(0, "Hello, World", True);
        OS.MessageBox(0, lpText, lpCaption, OS.MB_OK );
     
    end;
     
    end.

    コンパイル&実行方法

    C:¥> oxygene Hello.pas -ref:rt.jar;org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar -mode:Java
    C:¥> java -Xbootclasspath/a:org.eclipse.swt.win32.win32.x86_3.6.1.v3655c.jar -jar hello.jar

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  4. Hello, Win32 API(GAS) World!

    Posted on 3月 14th, 2013 by cx20

    Win32 API(GAS)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は GAS からの呼出し例である。

    ソースコード(GAS)

            .file   "hello.c"
            .def    ___main;        .scl    2;      .type   32;     .endef
            .section .rdata,"dr"
    LC0:
            .ascii "Hello, World!

    上記コードは、下記の C のソースを MinGW版 GCC にてアセンブリコード出力(gcc -S hello.c)したものである。

    ソースコード(C言語)

    #include <windows.h>
     
    int main( int argc, char* argv[] )
    {
        MessageBox( NULL, "Hello, Win32 API World!", "Hello, World!", MB_OK );
        return 0;
    }

    コンパイル方法(MinGW版 gcc)

    C:¥> gcc -c hello.s
    C:¥> gcc -o hello hello.o

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  5. Hello, Win32 API(LLVM) World!

    Posted on 3月 13th, 2013 by cx20

    Win32 API(LLVM)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は LLVM Assembler による呼出し例である。

    ソースコード(LLVM)

    ; ModuleID = 'hello.c'
    target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
    target triple = "i686-w64-mingw32"
     
    %struct.HWND__ = type { i32 }
     
    @.str = private unnamed_addr constant [24 x i8] c"Hello, Win32 API World!

    上記コードは、下記の C のソースを clang にてアセンブリコード出力(clang -S -O4 hello.c)したものである。

    ソースコード(C言語)

    #include <windows.h>
     
    int main( int argc, char* argv[] )
    {
        MessageBox( NULL, "Hello, Win32 API World!", "Hello, World!", MB_OK );
        return 0;
    }

    コンパイル方法(MinGW版 clang)

    C:¥> clang -o hello hello.ll

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  6. Hello, Win32 API(Objective-C) World!

    Posted on 3月 12th, 2013 by cx20

    Win32 API(Objective-C)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は MinGW 版 Objective-C による呼出し例である。

    ソースコード

    #import <windows.h>
     
    int main( int argc, char* argv[] )
    {
        MessageBox( NULL, "Hello, Win32 API World!", "Hello, World!", MB_OK );
        return 0;
    }

    コンパイル方法(MinGW Objective-C)

    C:¥> gcc -o hello hello.c -l objc

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  7. Hello, Win32 API(Tcl) World!

    Posted on 3月 11th, 2013 by cx20

    Win32 API(Tcl)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Tcl にて Ffidl を使用した Win32 API 呼出しの例となっている。

    ソースコード

    load Ffidl06.dll
    ffidl::callout dll_MessageBox {int pointer-utf8 pointer-utf8 int} int [ffidl::symbol user32.dll MessageBoxA]
    dll_MessageBox 0 "Hello, Win32 API World!" "Hello, World!" 0

    実行方法

    C:¥> tclsh Hello.tcl

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  8. Hello, Win32 API(Common Lisp) World!

    Posted on 3月 10th, 2013 by cx20

    Win32 API(Common Lisp)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Common Lisp にて FFI を使用した Win32 API 呼出しの例となっている。

    ソースコード

    (defpackage "WIN32"
      (:modern t)
      (:use "FFI")
      (:shadowing-import-from "EXPORTING"
        #:defconstant #:defun #:defmacro
        #:def-c-type #:def-c-enum #:def-c-struct #:def-c-var #:def-call-out))
     
    (in-package "WIN32")
     
    (default-foreign-language :stdc-stdcall) ; WINAPI means __stdcall
     
    (def-c-type handle c-pointer)
    (def-c-type dword uint32)
    (def-c-type word uint16)
     
    (default-foreign-library "user32.dll")
     
    (defconstant MB_OK 0)
     
    (def-call-out MessageBoxA (:return-type int)
      (:arguments (parent handle) (text c-string) (caption c-string) (type uint)))
     
    (win32:MessageBoxA nil "Hello, Win32 API World!" "Hello, World!" win32:MB_OK)

    実行方法

    C:¥> clisp Hello.lisp

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  9. Hello, Win32 API(OCaml) World!

    Posted on 3月 9th, 2013 by cx20

    Win32 API(OCaml)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は OCaml による Win32 API 呼出しの例となっている。

    ソースコード(C言語)

    #include <stdio.h>
    #include <windows.h>
    #include <caml/memory.h>
    #include <caml/mlvalues.h>
     
    #define Is_nil(v) ((v) == Val_int(0))
    #define Head(v) (Field((v), 0))
    #define Tail(v) (Field((v), 1))
     
    #define Declare_constants(name) 
        extern DWORD name[]; 
        extern int num_##name
     
    #define Define_constants(name) 
        int num_##name = sizeof(name) / sizeof(DWORD)
     
    #define Constant_val(val, constants) (constants[Int_val(val)])
     
    #define Handle_val(v) (*((HANDLE*)(v)))
    value alloc_handle(HANDLE h);
     
    value val_constant_with_count(DWORD constant, int num_constants, DWORD* constants);
     
    #define Val_constant(constant, constants) 
        (val_constant_with_count((constant), num_##constants, constants))
     
    Declare_constants(standard_control_ids);
     
    DWORD standard_control_ids[] = {
        IDABORT,
        IDCANCEL,
        IDCLOSE,
        IDHELP,
        IDIGNORE,
        IDNO,
        IDOK,
        IDRETRY,
        IDYES
    };
    Define_constants(standard_control_ids);
     
    DWORD message_box_options[] = {
        MB_ABORTRETRYIGNORE,
        MB_APPLMODAL,
        MB_DEFAULT_DESKTOP_ONLY,
        MB_DEFBUTTON1,
        MB_DEFBUTTON2,
        MB_DEFBUTTON3,
        MB_DEFBUTTON4,
        MB_HELP,
        MB_ICONASTERISK,
        MB_ICONERROR,
        MB_ICONEXCLAMATION,
        MB_ICONHAND,
        MB_ICONINFORMATION,
        MB_ICONQUESTION,
        MB_ICONSTOP,
        MB_ICONWARNING,
        MB_OK,
        MB_OKCANCEL,
        MB_RETRYCANCEL,
        MB_RIGHT,
        MB_RTLREADING,
        MB_SETFOREGROUND,
        MB_SYSTEMMODAL,
        MB_TASKMODAL,
        MB_TOPMOST,
        MB_YESNO,
        MB_YESNOCANCEL
    };
     
    value val_constant_with_count(DWORD constant, int num_constants, DWORD* constants)
    {
        int i;
     
        for (i = 0; i < num_constants; ++i)
            if (constants[i] == constant)
                return Val_int(i);
        failwith("Invalid constant");
        return Val_int(0);
    }
     
    CAMLprim value get_null_hwnd(value unit)
    {
        return alloc_handle(NULL);
    }
     
    value alloc_handle(HANDLE h)
    {
        value val;
     
        val = alloc_small(sizeof(HANDLE) / sizeof(value), Abstract_tag);
        Handle_val(val) = h;
        return val;
    }
     
    DWORD flags_val(value list, DWORD* constants)
    {
        int result;
     
        result = 0;
        for (; !Is_nil(list); list = Tail(list))
            result |= Constant_val(Head(list), constants);
        return result;
    }
     
    char* new_string(value v)
    {
        return strdup(String_val(v));
    }
     
    void free_string(char* s)
    {
        free(s);
    }
     
    static value* win32_error_exception = NULL;
     
    void raise_win32_error(DWORD error)
    {
        if (win32_error_exception == NULL)
            win32_error_exception = caml_named_value("win32 error");
        raise_with_arg(*win32_error_exception, Val_int((int)error));
    }
     
    void raise_last_error(void)
    {
        raise_win32_error(GetLastError());
    }
     
    CAMLprim value message_box(value wnd, value text, value caption, value type)
    {
        CAMLparam4(wnd, text, caption, type);
        HWND hwnd;
        char* txt;
        char* capt;
        UINT typ;
        int result;
     
        hwnd = Handle_val(wnd);
        txt = new_string(text);
        capt = new_string(caption);
        typ = flags_val(type, message_box_options);
        enter_blocking_section();
        result = MessageBox(hwnd, txt, capt, typ);
        leave_blocking_section();
        free_string(txt);
        free_string(capt);
        if (result == 0)
            raise_last_error();
        CAMLreturn(Val_constant(result, standard_control_ids));
    }

    ソースコード(OCaml)

    type hwnd
     
    type message_box_option =
        MB_ABORTRETRYIGNORE
      | MB_APPLMODAL
      | MB_DEFAULT_DESKTOP_ONLY
      | MB_DEFBUTTON1
      | MB_DEFBUTTON2
      | MB_DEFBUTTON3
      | MB_DEFBUTTON4
      | MB_HELP
      | MB_ICONASTERISK
      | MB_ICONERROR
      | MB_ICONEXCLAMATION
      | MB_ICONHAND
      | MB_ICONINFORMATION
      | MB_ICONQUESTION
      | MB_ICONSTOP
      | MB_ICONWARNING
      | MB_OK
      | MB_OKCANCEL
      | MB_RETRYCANCEL
      | MB_RIGHT
      | MB_RTLREADING
      | MB_SETFOREGROUND
      | MB_SYSTEMMODAL
      | MB_TASKMODAL
      | MB_TOPMOST
      | MB_YESNO
      | MB_YESNOCANCEL
     
    type standard_control_id =
        IDABORT
      | IDCANCEL
      | IDCLOSE
      | IDHELP
      | IDIGNORE
      | IDNO
      | IDOK
      | IDRETRY
      | IDYES
     
    external get_null_hwnd : unit -> hwnd = "get_null_hwnd"
    let null_hwnd = get_null_hwnd ()
     
    external message_box :
        wnd:hwnd ->
        text:string ->
        caption:string ->
        options:message_box_option list ->
        standard_control_id = "message_box"
     
    let () =
      ignore ( message_box ~wnd:null_hwnd ~text:"Hello, Win32 API World!" ~caption:"Hello, World!" ~options:[MB_OK] );

    実行方法

    C:¥> ocamlopt -o hello.exe hello.ml hello_stubs.c

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  10. Hello, Win32 API(Scheme) World!

    Posted on 3月 8th, 2013 by cx20

    Win32 API(Scheme)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は Scheme 実装の1つである Gauche による Win32 API 呼出しの例となっている。

    ソースコード

    (use os.windows)
     
    (define (main args)
      (sys-message-box #f "Hello, Win32 API World!" "Hello, World!" MB_OK)
      0)

    実行方法

    C:¥> gosh Hello.scm

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------