none
dll内の関数をVBAで呼べない。 RRS feed

  • 質問

  • dll内の関数をVBAで呼び出そうと思っていますが、うまくいきません。

    プロジェクトを作るときに、「Win32 プロジェクト」→「DLL」と作ったのですが、これはあってますか?

    下記にコードを載せておきます。

    どうぞよろしくお願いします。

     

    ■環境

    Windows XP x64

    Visual Studio 2005

    Office 2003 Pro

     

    ■Cのコード

    #include "stdafx.h"

    #define DllExport extern "C" __declspec (dllexport)

    DllExport long WINAPI TestFnc(long a, long b);

    BOOL APIENTRY DllMain( HANDLE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
          )
    {
     switch (ul_reason_for_call) {
      case DLL_PROCESS_ATTACH:
      case DLL_PROCESS_DETACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
       break;
     }
        return TRUE;
    }

    DllExport long WINAPI TestFnc(long a, long b)
    {
      return a+b;
    }

    ■VBAのコード

    Private Declare Function TestFnc Lib "C:\SSRILibraryC.dll" (ByVal a As Long, ByVal a As Long) As Long

    Sub dllTest()
        MsgBox "結果=" & TestFnc(1, 2)
    End Sub

    2007年10月23日 9:12

回答

  • 蒼の洞窟さん、引き続きご返信ありがとうございます。

     

    「Dependency Walker」が当初どこにあるかわからなかったのですが、ウェブ上で見つけて使ってみました。関数が見れるようになっていました。そこで関数名が「API用の名前」になっていることに気付きました。

     

    で、VBA側で

    Declare Function 関数名 Lib "DLL名" Alias "API名" (引数…) As 戻り値の型
    とするべきだとわかり、無事に関数の呼び出しに成功しました。
    ありがとうございました。
    2007年10月24日 6:14

すべての返信

  • まず、ちゃんとDLLの関数名が外部からみれるか確認してみてください。
    →Visutal Studio付属のDependency Walkerを使うとわかります。
       (<インストール先>\Microsoft Visual Studio 8\Common7\Tools\Bin\Depends.Exe)


    うまいこといかないなら、DllExportの#defineを使わないで、defファイルを使って関数名を

    エクスポートしてみてください。

     

    また、DLLを動かすのにモジュールが不足しているかどうかもDependency Walkerで確認できます。

    2007年10月23日 9:58
  • 蒼の洞窟さん、ご返信ありがとうございます。

     

    VBAでは下記のようなエラーメッセージが表示されます。

    「エントリ TestFnc が DLL ファイル C:\TestC.dll 内に見つかりません。」

    関数が外部から見れない状態のようです。

     

    > defファイルを使って関数名をエクスポートしてみてください。

    これはどのようにするのでしょうか?

     

    ところで、dllファイルが

    C:\・・・\Visual Studio 2005\Projects\TestC\debug

    内に作成されるのですが、これでいいんでしょうか?

    C:\・・・\Visual Studio 2005\Projects\TestC\TestC\Debug

    とかに作成されるとイメージしていたのですが。
    2007年10月23日 10:47
  • 結局Dependency Walkerで確認されていないのでしょうか?

    defファイルはソリューションツリーから項目の追加で、
    Visual C++→コード→モジュール定義ファイル(.def)を追加し、

    プロジェクトのプロパティより

    構成プロパティ→リンカ→入力→モジュール定義ファイル
    で追加したdefファイルを指定します。(Debug/Releaseともに)

    dllファイルの出力先は同じようにプロパティで変えられます。

    構成プロパティ→全般→出力ディレクトリ

    デフォルトは$(SolutionDir)$(ConfigurationName)となっています。

     

     

    defファイルの書き方はMSDNなりWebなりで検索してみてください。

    2007年10月23日 11:58
  • 蒼の洞窟さん、引き続きご返信ありがとうございます。

     

    「Dependency Walker」が当初どこにあるかわからなかったのですが、ウェブ上で見つけて使ってみました。関数が見れるようになっていました。そこで関数名が「API用の名前」になっていることに気付きました。

     

    で、VBA側で

    Declare Function 関数名 Lib "DLL名" Alias "API名" (引数…) As 戻り値の型
    とするべきだとわかり、無事に関数の呼び出しに成功しました。
    ありがとうございました。
    2007年10月24日 6:14