HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0131
クロウ・アッホーマシン語内でAPI関数を使う方法について7解決


クロウ・アッホー

リンク

2012/1/31(Tue) 21:41:12|NO.44629

すみませんm(_ _)m
下のスレに、スパムが入って勝手に解決済にされたようなので削除しました。
改めて宜しくお願いします。

始めましてm(_ _)m

HSP歴十数年(^^;)、ただいまようやくCでマシン語を作る勉強をしています。
ちょくとさんやblueleafさんのHPを参考にさせていただいているのですが、
どちらにもマシン語内で直接API関数を使う事は出来ず、関数アドレスをHSP側から
渡す事によって使うと解説されています。
私は、Microsoft Visual Studio C++ 2008とblueleafさんのMAKE.BATを使って
勉強をしているのですが、具体的どうすれば良いか分からないので、
参考情報がないかと色々調べたところ、こちらの下記のページに辿り着きました。
http://hsp.tv/play/pforum.php?mode=pastwch&num=17931
これだっ!と思って、やってみたのですがエラーになります。
そこでこのページのYOYOさんが作られた下記のスクリプトをまんまやってみたのですが、
やはりエラーになります。
いろいろ調べてみると、この「BOOL (WINAPI *SetPixelV)(HDC,int,int,COLORREF)」
関数アドレスを示す部分が認識されずにエラーになるようです。
YOYOさんはこれでマシン語を生成されたようなのですが、この書き方では、
VSC++ではダメなのでしょうか?
いろいろ他の情報も探ったのですが、現在お手上げの状態になっています。
どなたかご指導なりご助言を頂ければと思います。
宜しくお願いします。m(__)m

//YOYOさん作成のサンプルスクリプト #include <windows.h> void WINAPI DrawMandelbrotSet(HDC hdc, double *RealMin, double *ImagMax, double *step, int iteration, int width, int height, COLORREF *ColorTable, int LengthColorTable,BOOL (WINAPI *SetPixelV)(HDC,int,int,COLORREF),double d1,double d2) { int i, x, y; double hoge, re, im, real, imag; COLORREF color; real = *RealMin; for(x = 0; x < width; x++) { imag = *ImagMax; for(y = 0; y < height; y++) { re = 0.0; im = 0.0; color = RGB(0, 0, 0); for(i = 0; i < iteration; i++) { hoge = re; re = re * re - im * im + real; im = d1 * hoge * im + imag; if (re * re + im * im > d2) { color = ColorTable[i * LengthColorTable / iteration]; break; } } SetPixelV(hdc, x, y, color); imag -= *step; } real += *step; } }

checkさん、早速のご助言ありがとうございます。m(_ _)m
CでDLLは作った事は無いのですが、アクティブベーシックで
いくつか作った事はあります。
しかし、ちょっとした速度アップに、実行ファイルにあまり
DLLなど余分なアプリをつけたくないという思いもあって、
今まで避けてきたマシン語に取り組みました。(^^;)


XBG|YAMANOTE231103(PC)、早速のご助言ありがとうございます。m(_ _)m
教えていただいたページは、参考にしている上記のblueleafさんのページで
Cだと思いますが、ちょっと私には理解できませんでした。


引き続き、どなたかマシン語に関して
Microsoft Visual Studio C++ 2008 ベースでの
ご助言、ご指導を宜しくお願いします。m(_ _)m



この記事に返信する


晩御飯

リンク

2012/1/31(Tue) 22:19:48|NO.44633

どういう状況でエラーになっているのかよくわからないのだけど
外から関数を渡してやってもBOOL (WINAPI *SetPixelV)(HDC,int,int,COLORREF)のとこでエラーになる
ってことでいいのかな?



クロウ・アッホー

リンク

2012/2/1(Wed) 00:35:49|NO.44635

晩御飯さん、ありがとうございます。m(_ _)m
> どういう状況でエラーになっているのかよくわからないのだけど
上記のスクリプトをコンパイルするとエラーで当然マシン語は出来ません。
しかし、「BOOL (WINAPI *SetPixelV)(HDC,int,int,COLORREF)」の部分を削除して
コンパイルできてマシン語も出してくれます。
しかし、この部分がなければこのマシン語は動作しないのは明白ですよね。(><)
従ってHSPに組み込む以前のマシン語生成段階のことです。
それで私は、この「BOOL (WINAPI *SetPixelV)(HDC,int,int,COLORREF)」の
記述の仕方がVisual Studio C++ 2008では不正なのかと思って色々調べたのですが
分からなかったので、ここに質問した次第です。

引き続き、どなたかマシン語に関して
Microsoft Visual Studio C++ 2008 ベースでの
ご助言、ご指導を宜しくお願いします。m(_ _)m



晩御飯

リンク

2012/2/1(Wed) 01:19:15|NO.44636

マシン語生成できてないってそれHSPのエラーとかじゃなくてVCでのコンパイルエラーなのね
そのコンパイルエラーのエラー文が知りたいんだけれども



check

リンク

2012/2/1(Wed) 07:49:03|NO.44639

SetPixelVをSetPixelに書き換えてみるとか。
SetPixelVって何か特別な宣言が必要な関数だったっけ。



HK2

リンク

2012/2/1(Wed) 08:59:14|NO.44640

>マシン語内で直接API関数を使う事は出来ず
おそらく可能です。

http://wizardbible.org/17/17.txt
このページの第1章を使えば、機械語内で直接APIを使えるはずです。
以前、私はこの方法を使って、LoadLibraryAとGetProcAddressのアドレスを取得しました。
使用はしていませんが、取得したアドレスと普通の方法で取得したアドレスが一致したので、
使えるはずです。

なお、C++のインラインアセンブラを使う場合は、
C++が先にスタックにebpやローカル変数等を確保するので、
ebpの値をもとにスタックをたどっていく必要があります。
私が試したときは、スタックを5回ぐらいたどった気がします。

インラインアセンブラはebpの値を取得するためだけに使用することをお勧めします。



クロウ・アッホー

リンク

2012/2/1(Wed) 13:50:42|NO.44641

晩御飯さん、checkさん、度々のご助言ありがとうございました。m(_ _)m
HK2さん、有益な情報をありがとうございます。m(_ _)m
今の私にはまだ難しいですが将来役立てたいと思います。

んで(^^;)、昨日、初心に戻ろうとちょくとさんのページを何度も読み直し、
就寝直前に閃いた事があり、今日それを実行したところ、マシン語も生成され、
HSPからも無事動作が確認されました。\(^^)/
それは、BOOL型をFARPROC型に書き換えることでした。
色々なHPでもBOOLは設定されているとの解説でしたが、どうもVSCのコンパイラは
認識しないようでした。(--)?

思えば、この十年、私のHSPライフは、さくらさん、ちょくとさん、blueleafさん、
ぷまさんのページを参考に習作を繰り返して覚えてきました。
皆様、本当にありがとうございます。m(_ _)m



XBG|YAMANOTE231103(PC)

リンク

2012/2/1(Wed) 18:31:46|NO.44647

>教えていただいたページは、参考にしている上記のblueleafさんのページで

あ、ごめんなさい 思いっきりダブってましたね…失礼しました。



ONION software Copyright 1997-2018(c) All rights reserved.