tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVC++のDLLからVBへ値受け渡し
記事No12584
投稿日: 2008/06/19(Thu) 15:21
投稿者VB
○VC++のDLLの内容
typedef struct inf{
int    test1;
int    test2;
}  __inf;

_declspec(dllexport) int WINAPI test(struct inf* INFO)
{
int rtn = 0;
PINFO->test1 = 2;
PINFO->test2 = 3;
return (rtn);
}

○VBでの呼び出し
標準モジュール
Public Type inf
    test1 As Integer
    test2 As Integer
End Type
Public Declare Function clhsmain Lib "clhoshu.dll" (PINFO As pinf) As Integer

フォーム
Private Sub Button1_Click()
Dim INFO(0) As pinf
Dim rtn As Integer
Dim X As Integer
Dim Y As Integer
    rtn = test(INFO(0))
    X = INFO(0).test1
    Y = INFO(0).test2
End Sub

上記のような感じのプログラムを書いたのですが
INFO(0).test2の値には、ちゃんと3が入ってきているのですが、
INFO(0).test1の方には何も代入されずに返ってきてしまいます。
何か考えられる要因はありますでしょうか?
よろしくお願い致します。

[ツリー表示へ]
タイトルRe: VC++のDLLからVBへ値受け渡し
記事No12586
投稿日: 2008/06/19(Thu) 17:22
投稿者YuO
> ○VC++のDLLの内容
> typedef struct inf{
> int    test1;
> int    test2;
> }  __inf;

> ○VBでの呼び出し
> 標準モジュール
> Public Type inf
>     test1 As Integer
>     test2 As Integer
> End Type
> Public Declare Function clhsmain Lib "clhoshu.dll" (PINFO As pinf) As Integer

VB6のIntegerは16ビットなので,VC++側はshortに対応させます。
逆に,VC++ (32ビット〜) のintは32ビットなので,VB6ではLongに対応させます。
おそらく,問題点はここにあるかと。


なお,VC++のDLLについて,些細な問題ですが,
__から始まる識別子は,全ての使用について予約済みとなっています。
ref) ISO/IEC 9899:1999 7.1.3 Reserved identifiers
ref) ISO/IEC 14882:2003 17.4.3.1.2 Global names
一応,これらはライブラリ使用上の話ですが,識別子として使うのはやめた方が良いでしょう。

[ツリー表示へ]