Archive for the ‘Win32 API’ Category
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------
-
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 ---------------------------