「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@203) [低] [議論中]
@203■ (#561) WinAPIと利用するOSの問題 - area (2009-03-16 21:21) /中 未処理
【症状】
なでしこではWinAPIを利用できますが、利用できるWinAPIはOSのバージョンによって
変わってきます。

なでしこでWinAPIを利用しようとすると、利用しようとした関数が
DLLに存在するかを調べてくれますが、もしもWindows2000以降にしか実装されていない
関数を使おうとした場合、なでしこは関数が存在しない、という事でエラーとしてしまい、
そのプログラムはWindows2000以降でしか動作しなくなってしまいます。

実際には、なでしこスクリプト側でOSのバージョンによって利用するWinAPIを変更させる事が出来るのですが
これでは起動すらできません。
※現段階では"ナデシコする"を利用して回避することが出来ますが、あまり良い方法では無いかと思います。

指定されたDLLに指定された関数が存在しないと、以下のようなエラーが発生します。

大変申し訳ありません。下記のエラーが検出されました。
ご確認をお願いします。
-------------------------------
[エラー] com.nadesi.exe.nakopad.temp.nako1.bak(1): DLL「DLL名.dll」に関数「Test」が見当たりません。

【再現方法】
//
#以下をWin2000以前のOSで実行するとエラーになります。
●AddFontResourceExA(lpszFilename,fl,pdv) =DLL("gdi32.dll",
  "DWORD AddFontResourceExA(
    char* lpszFilename,   // フォントリソースファイル名
    DWORD fl,               // フラグ
    DESIGNVECTOR *pdv       // Multiple Master フォントを指定する
  )")
//
【要望】
存在しなかった場合も無視して続行できるような機能が欲しい
【バージョン】
1.517

(#790) RE:WinAPIと利用するOSの問題 - しらたま (2009-05-21 15:44) /中 調査中
一応、存在しないかもしれないDLL関数を呼び出すために「EXEC_PTR」という命令があるのですが、やはりわかりにくいでしょうか。
WEBリファレンスに説明がなかったので、サンプルを一つ追加してみましたが、いかがでしょう。

http://nadesi.com/man/page/EXEC_PTR

(#796) RE:RE:WinAPIと利用するOSの問題 - canot (2009-05-21 18:33) /中 未処理
>EXEC_PTR
たかがOSごとのAPI切り替え処理で
そこまで複雑なコードを書かなきゃいけないとなると
実用性がないに等しいと思います。
(しかもなでしこの標準的なAPIの利用方法じゃないですよね…)

これから64bit環境と32bit環境がますます混在するようになるでしょうし
Windowsカーネルも5シリーズ(2000,XP)と6シリーズ(Vista,7)が混在すると思うので
この問題はよく出るようになると思います。

APIと関数の記法を統合してしまったので大変だと思いますが
できるだけなでしこらしいシンプルで標準的な手法で(できれば1、2行で)
APIの互換性をチェックしてからロードできるようにならないでしょうか?

(#813) RE:RE:RE:WinAPIと利用するOSの問題 - クジラ飛行机 (2009-05-22 22:55) /中 議論中
なでしこの関数は、Windows API とマッピングすることができるので、
とても使いやすいのですが、反面、APIが存在しないときや、
DLLが存在しなかったときに、エラーになってしまうのが難点です。

現状、考えられる解決策:
(1)ひまわりの時のように、毎回、API宣言付きで関数を呼ぶ命令を作る:修正難易度(中)
(2)APIの定義時に、対象OSを指定できるように条件付きにする:修正難易度(低):汎用性も低い:DLL問題には未対応のため
(3)C言語のマクロのような機構を追加する:修正難易度(高):汎用性が高い

1が無難かな?という感じです。
ほかの解決策や、要望があればどうぞ。

(#817) RE:RE:RE:WinAPIと利用するOSの問題 - しらたま (2009-05-23 17:37) /中 議論中
私も2つほど案を考えていました。

1つはクジラ飛行机さんの(2)と同じで、Windowsのバージョン指定を入れるものです。
●hoge(a,b)=DLL("test.dll","int hoge(int a,int b)",[メジャーバージョン[,マイナーバージョン]])
のような感じで、Windowsのメジャーバージョンとマイナーバージョンを省略可能の形で追加できるように。
ただ、クジラ飛行机さんもおっしゃっているように、Win32APIでは良いかもしれませんが、他のDLLには対応できないので、汎用性が低いです。

もう1つは、「DLL」とは別に何らかのキーワード、仮に「DLLIF」、を導入して、
●hoge(a,b)=DLLIF("test.dll","int hoge(int a,int b)")
 ~関数が見つからなかったときの関数の処理内容~
という風に、DLL関数が見つからなかったときに行う処理を、普通の関数のように書くことが出来るようにする、というものです。
これだと、目的のDLL関数に合わせて、その関数が失敗したときの返り値を常に返すようにしたり、エラーメッセージを表示したりなど、柔軟な記述が出来ると思います。
ただ、内部構造として、このような書き方が許容できるかどうかは、確認していないため分かりませんが…

個人的には、出来るものなら後者の方法が採れるといいのですが、みなさんはいかがでしょう。

(#845) RE:RE:RE:RE:WinAPIと利用するOSの問題 - area (2009-05-25 19:01) /中 未処理
自分はしらたまさんの後者の案が良いと思うのですが、
日本語プログラミング言語ということですこし日本語らしくしてみました
//
★hoge(a,b) =DLL("test.dll",
  "int hoge(
    int a,
    int b,
  )")
  関数見つかった時は~
    関数hoge存在=オン
  関数見つからない時は~
    「指定されたDLLに指定された関数が存在しませんでした。」という。

もし、関数hoge存在=オンなら
  hoge(1,0)
//

こんなのはどうでしょうか?
ただ、したらまさんと同じく内部構造が分からないため
対応できるかはわからないのですが...

(#846) RE:RE:RE:RE:RE:WinAPIと利用するOSの問題 - area (2009-05-25 19:03) /中 議論中
申し訳ありません、間違えて状態を未処理にしてしまいました。
編集パスワードもタイプミスしたようなので、変更させて頂きますorz

(#869) とりあえずLuaを使うことで回避可能 - クジラ飛行机 (2009-06-04 00:46) /中 議論中
とりあえずは、Lua の alien モジュールを使うことで回避できそうです。
http://aoikujira.com/wiki/lua/index.php?alien

(#873) 使ってみました。 - area (2009-06-04 18:56) /中 議論中
早速最新版をDLし、動的にDLLを実行してみました。
が、LUAで実行した時も関数が見つからなければエラーで停止してしまいます。

うーん、やはり存在しなかった時の処理を実装するのは難しいのでしょうか。

//あと、どうでもいいのですが、なでしこはインタプリタで
//ソースを解析してからDLLをロードしてるので
//厳密には動的なロードかと思います。


(#977) わからない - kiki (2009-07-19 15:51) /緊急 詳細求む!
音声信号でプログラムを送信したいのですが、それがわかりません誰か教えてください

(#983) RE:わからない - U D (2009-07-19 21:23) /中 議論中
APIを使う話題、ということかもしれませんが。。。
流石にスレ違いですので、質問掲示板の方へどうぞ:
 http://bbs.himanavi.net/

というか・・・
「音声信号でプログラムを送信したい」というのが何をしたいかいまいち分からないです。。。
なでしこでやりたいのでしょうか・・・?

# 中、議論中に戻します。

(#993) alienでも動的リンクでエラーが! - クジラ飛行机 (2009-07-20 15:52) /中 議論中
> UDさん

たしかに、alien で関数のポインタを取得する時点でエラーが出てしまいますね(TT
しらたまさんの EXEC_PTR をうまくラップできると良いのですけどね。

あるいは、エラーが出たら、関数がないということなので
下記のようにするのはどうでしょうか?

=======
F関数 =『
require("alien")
-- mb = alien.User32.MessageBoxA
mb = alien.User32.Arienai
mb:types{ ret = 'long', abi = 'stdcall', 'long', 'string', 'string', 'long' }
mb(0, "Hello World!", "test", 64)


OKボタンとはボタン
OKボタンをクリックした時は~
  エラー監視
    F関数をLUAする
  エラーならば
    「関数がありません」と言う。
  ここまで
====

(#1000) 聞いてください - mop (2009-07-23 14:47) /緊急 詳細求む!
漢字を読みがなにかえるソースってありますか?

(#1002) RE:聞いてください - NON (2009-07-24 17:20) /中 議論中
質問は質問掲示板でやりましょう。
質問掲示板:http://bbs.himanavi.net/
初心者質問掲示板:http://www.eznavi.net/nade-1st/

※優先度・状態を戻します。

(#1005) LUAする か ナデシコする か - area (2009-07-25 14:48) /高 議論中
> クジラさん
LUAするでエラーが帰ってきた時には関数が利用しないと判断する、というのは
自分も考えたのですが、実はこれLUAを使わなくてもほぼ同じ事が出来ます。

//ここから
エラー監視
  『●Dummy() =DLL("DummyLibrary.dll","HRESULT Dummy()")』をナデシコする
エラーならば
  『関数がありません。』という
//ここまで

ですが、ナデシコする、やLUAする、はどちらとも式を評価しそのまま実行しています。
そのため、exeそのものや実行後にメモリを改ざんされることにより、任意のスクリプトが
実行されてしまう危険性がありそうで、使うのを躊躇ってしまうのです。

※ここ何日か話題が反れていたので
 再度目に止めていただけるよう優先度を上げさせて頂きます、すみません。

(#2220) 質問 - nadenade (2013-10-26 19:46) /緊急 議論中


※※※積み木デザイナ:ここから※
※ 以下はデザインデータです。
※ コメントを削除しないようにしてください。
※ ---
※母艦とはフォーム##生成
母艦は「メインフォーム」
そのクライアントW=992#数値
そのクライアントH=600#数値
そのタイトル=「なでしこ」#文字列
※ ---
メモ1とはメモ##生成
そのX=0#数値
そのY=24#数値
そのW=992#数値
そのH=568#数値
そのテキスト=「」#文字列
そのスクロールバー=「」#文字列
※ ---
ボタン1とはボタン##生成
そのX=0#数値
そのY=0#数値
そのW=72#数値
そのH=24#数値
そのテキスト=「ボタン1」#文字列
※ ---
ボタン2とはボタン##生成
そのX=72#数値
そのY=0#数値
そのW=72#数値
そのH=24#数値
そのテキスト=「ボタン2」#文字列
※ ---
ボタン3とはボタン##生成
そのX=144#数値
そのY=0#数値
そのW=72#数値
そのH=24#数値
そのテキスト=「ボタン3」#文字列
※ ---
ボタン4とはボタン##生成
そのX=216#数値
そのY=0#数値
そのW=72#数値
そのH=24#数値
そのテキスト=「ボタン4」#文字列
※ ---
ボタン5とはボタン##生成
そのX=288#数値
そのY=0#数値
そのW=72#数値
そのH=24#数値
そのテキスト=「ボタン5」#文字列
※※※積み木デザイナ:ここまで※
「ボタン1」クリックした時
「おいしい」と表示
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「ボタン1」クリックした時
「おいしい」と表示したかったんですが、どこがおかしいですか

(#2255) とりあえず - クジラ飛行机 (2014-01-28 02:19) /低 議論中
抜本的な解決策はまだないにしても
議論が落ち着いているので、とりあえず、優先度下げます。

ちなみに、質問は、質問板でお願いします。



(#561)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能