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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0727
箋巖DLLファイルを作成して使用してみたら13解決


箋巖

リンク

2007/7/27(Fri) 14:16:47|NO.9797

今回は自作DLLファイルを作成してみたところ『外部DLLの呼び出しに失敗しました』という
エラーが出ました。
しかし、検索してみたらhsp3.exeと同じフォルダか実行ファイルと同じフォルダに無い場合
かその他と書いてあったので両方のフォルダに作成したDLLファイルを入れてもエラーが解消
されませんでした。
これはどうすればエラーが直るでしょうか?

HSP
ファイル名test.as

#uselib "HSPDLL2_2.dll" #func test test $202

ファイル名test.hsp

#include "test.as" mes a test a mes a

C言語ソース
ファイル名 HSPDLL.dll


#include <windows.h> #include <vcl.h> #include "hspdll.h" typedef struct HSPEXINFO { // HSP internal info data (2.6) // short ver; // Version Code short min; // Minor Version // int *er; // Parameter Error Flag char *pstr; // String Buffer (master) char *stmp; // String Buffer (sub) PVAL **pval; // Master PVAL ptr. // int *actscr; // Active Window ID int *nptype; // Next Parameter Type int *npval; // Next Parameter Value int *strsize; // StrSize Buffer char *refstr; // RefStr Buffer // int (*HspFunc_prm_getv)( void ); int (*HspFunc_prm_geti)( void ); int (*HspFunc_prm_getdi)( int defval ); char *(*HspFunc_prm_gets)( void ); char *(*HspFunc_prm_getds)( char *defstr ); int (*HspFunc_val_realloc)( PVAL *pv, int size, int mode ); int (*HspFunc_fread)( char *fname, void *readmem, int rlen, int seekofs ); int (*HspFunc_fsize)( char *fname ); void *(*HspFunc_getbmscr)( int wid ); /*int (*HspFunc_getobj)( int wid, int id, HSPOBJINFO *inf ); int (*HspFunc_setobj)( int wid, int id, HSPOBJINFO *inf );*/ // } HSPEXINFO; EXPORT WINAPI BOOL test(HSPEXINFO *,int,int,int); int WINAPI DllMain( HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved ){ return TRUE; } EXPORT WINAPI BOOL test(HSPEXINFO *hei,int,int,int){ int *ep1; ep1=(int *)hei->HspFunc_prm_getv(); if (*hei->er) return *hei->er; *ep1=100; return 0; }



この記事に返信する


f

リンク

2007/7/27(Fri) 16:46:28|NO.9805

なんかそのCのソース、コンパイルできる気がしねんだけど・・・。
コンパイラ何・・・?



箋巖

リンク

2007/7/27(Fri) 17:10:37|NO.9808

Turbo C++を使っています

また、ソースの方の構造体宣言に関してはサンプルページとかを見ても載っていなかったの
ですが宣言をしないとHSPEXINFOが使えなかったので宣言しました。
(ソースはhttp://www.onionsoft.net/hsp/hspdll.htmlのページのを使いました。)
また、そのままの宣言だとコンパイル時にエラーが発生してしまったので
PVAL2をPVALに変更し
int (*HspFunc_getobj)( int wid, int id, HSPOBJINFO *inf );
int (*HspFunc_setobj)( int wid, int id, HSPOBJINFO *inf );
↑の二行は消しました。



f

リンク

2007/7/27(Fri) 17:27:26|NO.9811

とりあえず、HSP2.6仕様プラグインで、変数に100を返すだけなら、
#include <windows.h>
#include "hspdll.h" int WINAPI DllMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved) { return TRUE; } EXPORT BOOL WINAPI test(void *p1, int p2, int p3, int p4) { *(int *)p1 = 100; return 0; }
HSP
#uselib "test.dll"
#func test test 1 mes a test a mes a
これで良いみたいだが。

VC++だけど。



kz3

リンク

2007/7/27(Fri) 17:28:44|NO.9812

プラグインを作る前にC言語をちゃんと勉強したほうが良さそうです。
そしてここはHSP掲示板なので作れていない『Cプログラム』に関する質問をするところではないかと...。



f

リンク

2007/7/27(Fri) 17:39:37|NO.9814

>そしてここはHSP掲示板なので作れていない『Cプログラム』に関する質問をするところではないかと...。

ああ・・・・

言われてみれば、これは「プラグインからデータを受け取れない話」ではなくて
「DLLが正しく作れていない」話ですな・・・。

最近丸くなってイカン・・・。



箋巖

リンク

2007/7/27(Fri) 17:43:13|NO.9815

何だかこっちのコンパイラが原因だと思うのですがfさんのソースをそのままコンパイルする
とリンカエラーになってしまう(汗

一応コンパイラの設定では『VC++スタイルのDLL』を作成にしているのですがね(汗

それと、kz3さん私が質問しているのはDLLファイルの作成後の命令を使う段階でのエラー
なのですがそれでもC言語の質問だと言うことでしょうかね?
一応funcまでは正常に行ったのですがいざ使ってみるとその命令の場所でエラーになってしま
っていて…



f

リンク

2007/7/27(Fri) 18:51:53|NO.9816

なんにしろ、俺自身はTurbo C++でのwindows用のこまごまはよくわからないので、

http://www.microsoft.com/japan/msdn/vstudio/express/

で、手に入るVC++のエクスプレスエディションでコンパイルしてはどうかと言う提案しか。



naznyark

リンク

2007/7/28(Sat) 00:55:40|NO.9829

> 「DLLが正しく作れていない」話

確かに気になるところはありますが、
いちおうTurbo C++ での関数のエクスポート名の問題なのでは?

#func test test $202
を、以下のどれかにしてみては?

#func test "test" $202 #func test "_test" $202 #func test "test@16" $202 #func test "_test@16" $202



f

リンク

2007/7/28(Sat) 02:41:54|NO.9831

むぅ。それで動くようなら失礼な事を言ったのかも知れず。
エクスポート名の話は知ってはいたものの。

なんか・・・・ソースの・・・・印象で・・・・・。
つか、マジでコンパイル通る気しないんだけど・・・。
TurboC++は・・・こう書くのだろうか・・・。



箋巖

リンク

2007/7/28(Sat) 11:15:17|NO.9838

naznyarkさん本当に感謝ですww

どうやら原因はエクスポート名が原因だったみたいです。
#func test test $202

#func test "test" $202
に変更したら実行できましたww
本当にありがとうございました。

それと、これはfさんの発言で少々気になったことがあったのですが少し質問をさせていただ
いても宜しいでしょうか?
C言語は元々フリーフォーマットだと(名前違ったかな?取り合えず書き方は自由)思ったので
すがソースのどの辺りが駄目だと思われたのでしょうか?



f

リンク

2007/7/28(Sat) 16:41:26|NO.9842

うん?

そういう聞きかたされると、自分の方が不思議に思うのだが、
普通、構造体の再定義して正常にコンパイル出来るとは思わないんでね?



f

リンク

2007/7/28(Sat) 16:45:43|NO.9843

おお、忘れる所だった。

動作したという事はDLLは正常に出来ていたと言う事で、
自分の「DLLが出来てない」発言は明らかに誤りで御座いました。
謝罪いたします。



箋巖

リンク

2007/7/28(Sat) 16:49:11|NO.9844

たしかに、構造体の再定義をするのは間違っていると思うのですがhspdll.hの中身を見ても
私が宣言した構造体が入っていませんし構造体の宣言を抜いてコンパイルをしてしまうと逆
に引数宣言はHSPEXINFOでは始められないというエラーになってしまうので、多分私の使って
いる環境では何処にも宣言がしていなかったのだと思います(汗



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