Gauche:WinAPI

Gauche:WinAPI

shelarcy(2004/07/29 05:41:39 PDT): とりあえずまずは Gauche:MeCab の mecab の部分を win に置き換えてスタート。MinGW と cygwin 版で使うことを想定。

win.stub

;;;
;;; win.scm - WinAPI binding
;;;
;;;   Copyright (c) 2004 shelarcy, All rights reserved.
;;;
;;;   Redistribution and use in source and binary forms, with or without
;;;   modification, are permitted provided that the following conditions
;;;   are met:
;;;
;;;   1. Redistributions of source code must retain the above copyright
;;;      notice, this list of conditions and the following disclaimer.
;;;
;;;   2. Redistributions in binary form must reproduce the above copyright
;;;      notice, this list of conditions and the following disclaimer in the
;;;      documentation and/or other materials provided with the distribution.
;;;
;;;   3. Neither the name of the authors nor the names of its contributors
;;;      may be used to endorse or promote products derived from this
;;;      software without specific prior written permission.
;;;
;;;   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
;;;   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
;;;   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
;;;   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
;;;   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
;;;   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
;;;   TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
;;;   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
;;;   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
;;;   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
;;;   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;;;
;;;  $Id: mecab.stub,v 1.1.1.1 2004/07/10 13:00:46 fuyuki Exp $
;;;

"
 #include <gauche/extend.h>
 #include <windows.h>

"

;; NB: this should be taken care of by genstub.
(define-type <dword> "DWORD" "DWORD"
  "SCM_EXACTP" "Scm_GetUInteger" "Scm_MakeIntegerFromUI")
(define-type <handle> "HANDLE" "HANDLE"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hbrush> "HBRUSH" "HBRUSH"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hcursor> "HCURSOR" "HCURSOR"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hdc> "HDC" "HDC"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hicon> "HICON" "HICON"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hinstance> "HINSTANCE" "HINSTANCE"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hmenu> "HMENU" "HMENU"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <hwnd> "HWND" "HWND"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <lparam> "LPARAM" "LPARAM"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <lpctstr> "LPCTSTR" "LPCTSTR"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <lprect> "LPRECT" "LPRECT"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <lptstr> "LPTSTR" "LPTSTR"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <lpvoid> "LPVOID" "LPVOID"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <lresult> "LRESULT" "LRESULT"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <msg> "MSG" "MSG"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <timerproc> "TIMERPROC" "TIMERPROC"
  "SCM_PROCEDUREP" "SCM_PROCEDURE")
(define-type <u_int> "UINT" "UINT"
  "SCM_EXACTP" "Scm_GetUInteger" "Scm_MakeIntegerFromUI")
(define-type <wparam> "WPARAM" "WPARAM"
  "SCM_EXACTP" "Scm_GetInteger" "Scm_MakeInteger")
(define-type <wndproc> "WNDPROC" "WNDPROC"
  "SCM_PROCEDUREP" "SCM_PROCEDURE")

;; (define-enum WNDCLASS)


;;=============================================================
;; Miscellaneous
;;

(define-cproc win-create-window (lpClassName::<lpctstr> lpWindowName::<lpctstr> dwStyle::<dword>
                                 x::<int> Y::<int> nWidth::<int> nHeight::<int>
                                 hWndParent::<hwnd> hMenu::<hmenu> hInstance::<handle> lpParam::<lpvoid>)
  (return <hwnd> "CreateWindow"))

(define-cproc win-destroy-window (hWnd::<hwnd>)
  (return <boolean> "DestroyWindow"))

(define-cproc win-draw-text (hdc::<hdc> lpString::<lpctstr> nCount::<int>
                             lpRect::<lprect> uFormat::<uint>)
  (return <int> "DrawText"))

(define-cproc win-kill-timer (hWnd::<hwnd> uIDEvent::<u_int>)
  (return <boolean> "KillTimer"))

(define-cproc win-message-box (hWnd::<hwnd> lpText::<lpctstr> lpCaption::<lpctstr> uType::<u_int>)
  (return <int> "MessageBox"))

(define-cproc win-print (lpOut::<lptstr> lpFmt::<lpctstr>)
  (return <int> "wsprintf"))

(define-cproc win-set-timer (hWnd::<hwnd> nIDEvent::<u_int> uElapse::<u_int> lpTimerFunc::<timerproc>)
  (return <u_int> "SetTimer"))

(define-cproc win-show-window (hMenu::<hmenu> nCmdShow::<int>)
  (return <boolean> "ShowWindow"))


;; Local variables:
;; mode: scheme
;; end:

状況

$ make check
/usr/local/bin/gosh -I. test.scm > test.log
Testing win ...                                                  make: *** [check] Error 139

コアダンプ (Error 139) ですか。簡単には直りそうにない感じ。というか、関数か define-enum がある時点でコアダンプを起こします。

質問

これまでのミス

$ make
/usr/local/bin/gosh genstub win.stub
gcc  -g -O2 -I/usr/local/lib/gauche/0.8.1/include  -c win.c -o win.o
win.c: In function `win_win_create_window':
win.c:38: error: syntax error before "LPCTSTR"
win.c:41: error: syntax error before "LPCTSTR"
win.c:44: error: syntax error before "DWORD"
win.c:59: error: syntax error before "HWND"
win.c:62: error: syntax error before "HMENU"
win.c:65: error: syntax error before "HANDLE"
win.c:68: error: syntax error before "LPVOID"
win.c: In function `win_win_show_window':
win.c:86: error: syntax error before "HMENU"
win.c:91: warning: passing arg 1 of `ShowWindow' from incompatible pointer type
win.c: In function `Scm_Init_win':
win.c:103: error: syntax error before "WNDCLASS"
win.c:103: error: syntax error before ')' token
make: *** [win.o] Error 1
rm win.c

どこが間違っているんだろうか? win.c が残らないだけにどうなってるのか分からない。もう少し調べて見ますが……

実行コマンド

$ ./autogen.sh
$ ./configure
$ make
$ make check

gauche.m4 が usr/local/share/gauche/{Version} のところにも `aclocal --print-ac-dir` のパスにもなくて、 usr/local/share/aclocal から移動しなければならなかったのですが、これってうちの環境だけでしょうか?

/cygdrive/c/mingw/bin が cygwin の etc/profile の PATH の最初にある状態でやってみると、make 時に gauche 関係のヘッダファイルが見つからない。PATH の設定を変えればどうにかなるんだろうけど、それでいいのかな?


Last modified : 2012/02/07 08:58:24 UTC