可変引数をCライブラリに渡したい

解決


コナン  2009-10-31 03:00:10  No: 142719

環境: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回くらいコールしたところで
「スタック領域が不足しています」とメッセージがでて終了してしまいます。

原因がわからないため、質問させて戴きました。
宜しくお願い致します。


オショウ  2009-10-31 04:41:15  No: 142720

こらでけでは、どうにもコメントのしようがありませんが
メモリリークしている可能性があると思います。

また、Stringを渡しているので、そのポインタの扱いとか
C側でどうやっておられるのか・・・

尚、このFuncAの戻り値はあるんですか?ないんですか?

※  空きメモリの容量が減っていくと思いますので、実行
    中にメモリリソ−スを見れるツールを別途起動してお
    けば、回数が進むにつれ、減っていくのが観測できる
    と思います。

以上。(あくまで参考)


オショウ  2009-10-31 04:41:50  No: 142721

ミス入力・・・恥・・・

以上。


Hongliang  2009-10-31 06:29:42  No: 142722

可変長引数をサポートする呼び出し規約は 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 じゃなかったでしたっけ?


コナン  2009-11-02 19:19:58  No: 142723

オショウ、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

呼び出し規約は意識していませんでした。
ちょっとアプローチを変えて試してみます。
ありがとうございました。


コナン  2009-11-02 19:21:53  No: 142724

>以下は関数のソースコードです。
すいません、間違っていました。

int WINAPI FuncA( int arg,char *lpcFmt, ... )
{
    return 0;
}


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加