none
VC++で作成したDLLから戻り値は受け取れるでしょうか? RRS feed

  • 質問

  • Win10 x64 visual sutudio2010で開発しています。

    Visual Basicは初心者です。

    VC++で作成したDLLを、VBからCALLできるか試そうとしています。

    DLL側の関数

    UINT WINAPI Manage_Ini(UINT id)

    {
    return 1;
    }

    ------

    defファイル

    LIBRARY      "VCDLL"

    EXPORTS
    Manage_Ini @1

    =========

    VB側

    Public Class Form1

    ①   Private Declare Sub m_ini Lib "vcdll.dll" Alias "Manage_Ini" (ByVal id As Long) As Long 

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            m_ini(1)
        End Sub
    End Class

    =========

     このようにコーディングすると、

     ① Private Declare Sub m_ini Lib "vcdll.dll" Alias "Manage_Ini" (ByVal id As Long) As Long

    ①行の最後の、”As Long”で、「ステートメントの終わりを指定してください」と表示されます。

    DLLの戻り値の宣言はどうのようにすればよいでしょうか?

    戻り値を受け取ることはできないのでしょうか?

    全くの初心者で、初歩的な質問で申し訳ありません。

    ご指導、よろしくお願いいたします。


    kizakura_ui

    2020年9月29日 12:39

回答

  • 構文エラーについては、Declare Sub を Declare Function に改めれば通るはずです。

    しかし C++ の UINT は、.NET の System.UInt32 相当の 4 バイト整数型です。
    VB の Long は、8 バイトの System.Int64 のことなので、宣言も間違っています。
    4 バイト整数型である UInteger (UInt32) か Integer (Int32) に変更する必要があるでしょう。

    • 回答としてマーク kizakura_ui 2020年9月30日 0:46
    2020年9月29日 13:13
  • VBにおいて戻り値のある関数はFunctionです。

     Private Declare Function m_ini Lib "vcdll.dll" Alias "Manage_Ini" (ByVal id As UInt32) As UInt32

    また、C++のUINT(符号なし32bit)は、VB.NetではUInteger あるいはUInt32が対応します。
    VB.NetでのLongは符号なし64bitLongは符号付き64bitです


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!


    • 回答としてマーク kizakura_ui 2020年9月30日 0:46
    • 編集済み gekkaMVP 2020年9月30日 3:30 符号有り無し間違い訂正
    2020年9月29日 13:04

すべての返信

  • VBにおいて戻り値のある関数はFunctionです。

     Private Declare Function m_ini Lib "vcdll.dll" Alias "Manage_Ini" (ByVal id As UInt32) As UInt32

    また、C++のUINT(符号なし32bit)は、VB.NetではUInteger あるいはUInt32が対応します。
    VB.NetでのLongは符号なし64bitLongは符号付き64bitです


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!


    • 回答としてマーク kizakura_ui 2020年9月30日 0:46
    • 編集済み gekkaMVP 2020年9月30日 3:30 符号有り無し間違い訂正
    2020年9月29日 13:04
  • 構文エラーについては、Declare Sub を Declare Function に改めれば通るはずです。

    しかし C++ の UINT は、.NET の System.UInt32 相当の 4 バイト整数型です。
    VB の Long は、8 バイトの System.Int64 のことなので、宣言も間違っています。
    4 バイト整数型である UInteger (UInt32) か Integer (Int32) に変更する必要があるでしょう。

    • 回答としてマーク kizakura_ui 2020年9月30日 0:46
    2020年9月29日 13:13
  • さっそくお指導ありがとうございました。

    うまく動作しました。

    今後ともよろしくお願いいたします。


    kizakura_ui

    2020年9月30日 0:49
  • VB.NetでのLongは符号なし64bitです

    Long は符合なしではなく、符号付きですね。

    符号なし整数型 → Byte(8bit)、UShort(16bit)、UInteger(32bit)、ULong(64bit)
    符号付き整数型 → SByte(8bit)、Short(16bit)、Integer(32bit)、Long(64bit)

    2020年9月30日 2:52
  • あぁ、書き間違えです。
    指摘ありがとうございます。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2020年9月30日 3:33