環境:VB6.0 WindowsXP
CでDLLを作成し、可変個引数の関数を作成しました。(以下関数宣言)
FuncA( int arg,char *lpcFmt, ... )
この関数は今のところ何もせず、returnするだけです。
この関数をVB側で使用すべく以下のように宣言しました。
Public Declare Function FuncA Lib "VaLIB" (
ByVal arg As Integer,
ByVal lpFmt As String,
Optional ByVal lpData1 As String,
Optional ByVal lpData2 As String,
Optional ByVal lpData3 As String,
Optional ByVal lpData4 As String )
VB側では終了ボタンを押すまで関数コールを繰り返す、
という処理を行うだけなのですが、13000回くらいコールしたところで
「スタック領域が不足しています」とメッセージがでて終了してしまいます。
原因がわからないため、質問させて戴きました。
宜しくお願い致します。
こらでけでは、どうにもコメントのしようがありませんが
メモリリークしている可能性があると思います。
また、Stringを渡しているので、そのポインタの扱いとか
C側でどうやっておられるのか・・・
尚、このFuncAの戻り値はあるんですか?ないんですか?
※ 空きメモリの容量が減っていくと思いますので、実行
中にメモリリソ−スを見れるツールを別途起動してお
けば、回数が進むにつれ、減っていくのが観測できる
と思います。
以上。(あくまで参考)
ミス入力・・・恥・・・
以上。
可変長引数をサポートする呼び出し規約は cdecl ですが、Declare 構文だと stdcall しか扱えなかったと思います。
VB.NET 以降なら DllImport で呼び出し規約を変更できますが、VB6 では面倒そうですね。
http://www.google.co.jp/search?lr=lang_ja&lr=lang_ja&oe=utf-8&q=vb%20cdecl
// VB6 だと Integer は 16bit じゃなかったでしたっけ?
オショウ、Hongliangさん
回答ありがとうございます。
>また、Stringを渡しているので、そのポインタの扱いとか
>C側でどうやっておられるのか・・・
今のところ何もしていません。
今後、printf関数のようなものを作成しようと思っています。
>尚、このFuncAの戻り値はあるんですか?ないんですか?
大変申し訳ありません。宣言になっていませんでした。
以下は関数のソースコードです。
int FuncA( int arg,char *lpcFmt, ... )
{
return 0;
}
VB側からは終了ボタンが押されるまでコールし続けます。
Private Sub Form_Load()
Static lCallCnt As Long '呼出回数
'終了ボタンが押されるまでループする
Do While Command1.Enabled
'カウントアップ
lCallCnt = lCallCnt + 1
'DLL呼び出し
Call FuncA(2, "呼び出し", lCallCnt)
DoEvents
Loop
MsgBox "呼び出した回数:" & lCallCnt
Unload Me
End Sub
呼び出し規約は意識していませんでした。
ちょっとアプローチを変えて試してみます。
ありがとうございました。
>以下は関数のソースコードです。
すいません、間違っていました。
int WINAPI FuncA( int arg,char *lpcFmt, ... )
{
return 0;
}
ツイート | ![]() |