none
Win Vista 上で Visual Studio 2008 β1 の C++ で作成した DLL が Win XP 上で動作しない RRS feed

  • 質問

  • DLL を Win Vista 上で Visual Studio 2008 の C++ で、MFC DLL の Regular DLL using shared MFC DLL として次のように作成しました。
    そして、同じPC上で Excel 2007 VBA からこの DLL を呼べば正しく動作しますが、
    Win XP 上の Excel 2000 VBA からこの DLL を呼ぶと、
    「実行時エラー '58'  ファイルが見つかりません。FuncDll.dll」とエラー
    表示されます。
    Internet 関係のセキュリティー関係は標準です。

    動作するようにする方法があるのでしょうか?
    MFC のバージョンが違うとだめなのでしょうか?
    MFC を使わず、 Win32 Console の DLL にする必要があるのでしょうか?

     

    //***********************************************
    // FuncDll.cpp : Defines the initialization routines for the DLL.

    #include "stdafx.h"
    #include "FuncDll.h"

    extern "C" short __stdcall Func1(long *x)
    { AFX_MANAGE_STATE(AfxGetStaticModuleState())
           *x = 1000L;
          return((short)1);
    }

    extern "C" /* __declspec(dllexport) */ short __stdcall Func2(long *x)
    { AFX_MANAGE_STATE(AfxGetStaticModuleState())
           *x = 2000L;
          return((short)2);
    }

     

    //***********************************************
    ; FuncDll.def : Declares the module parameters for the DLL.

    LIBRARY      "FuncDll"

    EXPORTS
        ; Explicit exports can go here
           Func1       @1
           Func2       @2

     

    //***********************************************
    Dumpbin した結果は以下のとうりです。
    dumpbin /exports funcdll.dll
    Microsoft (R) COFF/PE Dumper Version 9.00.20404
    Copyright (C) Microsoft Corporation.  All rights reserved.

    Dump of file funcdll.dll

    File Type: DLL

      Section contains the following exports for FuncDll.dll

        00000000 characteristics
        469304CB time date stamp Tue Jul 10 13:02:19 2007
            0.00 version
               1 ordinal base
               2 number of functions
               2 number of names

        ordinal hint RVA      name

              1    0 00001040 Func1 = _Func1@4
              2    1 00001090 Func2 = _Func2@4

      Summary

            1000 .data
            1000 .rdata
            1000 .reloc
            1000 .rsrc
            2000 .text

     

    //***********************************************
    Excel からこの DLL を呼ぶ VBA コードは以下です。
    Declare Function Func1 Lib "FuncDll.dll" (x As Long) As Integer

    Sub Test()
        Dim x As Long, y As Long
       
        y = Func1(x)
        ActiveSheet.Range("A1") = y
        ActiveSheet.Range("B1") = x
    End Sub

     

    よろしくお教えください。

    2007年7月10日 5:10

すべての返信

  • Xp側にCのランタイムはインストール済みなんでしょうか?
    (Visual Studio 2008 β1 のランタイムがあるかは知らない)
    # VS2005でもランタイムのインストールが必要ですし。

    >Regular DLL using shared MFC DLL
    sharedってことは共通DLLでMFCを使用ってことなんで、Xp側にMFCのインストールが必要そうですが。
    (スタティックリンクだと、、、)
    2007年7月10日 5:58
  • お教え、ありがとうございます。

     

    Win XP のPC には古い Visual Studio 2002 があります。

    そして、この VC2002で作成した DLL は 同じ XP のPC のExcel 2000 は動作しますが、Vista Excel 2007では動作しません。

    一方、さらに古い Win 98SE の Visual Studio C++ 6.0 で作成したDLL は、XP とVista の両方のPC で動作します。

    常にVC6でDLLを作ればいいのですが、やはり新しいVC2008 を使いたいと思います。

     

    念のため、Vista VC2008 で、MFCを使わないで、Win32 Console Application の DLL でもDLLを作成してテストしましたが、同様に、XP では動作しません。ファイルが無いというエラーが出ます。

    MFCには関係ないように思います。

    なにか、根本的な簡単な間違いでしょうか?

     

    よろしくお願いします。

     

     

     

     

     

     

    2007年7月10日 7:15
  • ですから、もう回答済みですよね?
    要約すると、

    VS2008で作られたものは、VS2008のCのランタイムがインストールされていないと使えない。
    VS2005で作られたものは VS2005のCのランタイムがインストールされていないと使えない。
    VS2005 SP1で作られたものは VS2005 SP1のCのランタイムがインストールされていないと使えない。
    VS2003、VS2002はシラネ。

    VC6で作られたものは、おそらく何もインストールしなくても使える。(Vistaも)
    VC5もおそらくそう。
    (古いOSだとどうなるかは知らない)


    VS2008のCのランタイムは公式のものが出回っているかも知らない。(なさそう。なんせβ版だし。)



    追記
    CRTをスタテックリンクできればランタイムのインストールは不要そうです。
    http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=1623968&SiteID=7
    2007年7月10日 7:42
  • 何度も ありがとうございました。

    よくわかりました。

     

    2007年7月10日 10:49