Solved

How do I get Excel 2013 on Windows 7 to access C++ DLL functions that are successfully accessed by Excel 2010 on Windows XP.

Posted on 2014-10-27
2
678 Views
Last Modified: 2014-10-28
I have written a C++ DLL using Microsoft Visual Studio 2010.  The DLL contains a function that takes as parameters 2 doubles and returns their product as a double.  Using Excel 2010 on Windows XP I am able to get access to this function using VBA but using Excel 2013 on Windows 7 I encounter an error.  I have added the PtrSafe keyword in the declaration of the function in Excel 2013 but this has not resolved the problem.

Here is the C++ routine in the DLL that is being tested:
double __stdcall SimpleMultiply(double x, double y)
{
      double result = x * y;

      return result;
}

Here is the *.def file in the C++ project which controls the names of the exported routines:
LIBRARY "Calculate"
EXPORTS
CalculateEXL = Calculate
TestSettingDoublesEXL = InitializeDoubles
SimplyMultiplyTestEXL = SimpleMultiply

It should be noted that all three of the routines (CalculateEXL, TestSettingDoublesEXL and SimplyMultiplyTestEXL) are listed when I run dumpbin /exports myDLL.dll from a Command Prompt.

Here is what my VBA code looks like in Excel 2010 on Windows XP:
Option Explicit

Private Declare Function SimplyMultiplyTestEXL Lib "C:\myProject\Debug\myDLL.dll" (ByVal x As Double, ByVal y As Double) As Double
Sub testTheDLL()

    Dim a As Double
    Dim b As Double
    Dim c As Double
   
    a = 6.1
    b = 2.5
   
    c = SimplyMultiplyTestEXL(a, b)

End Sub

Here is what my VBA code looks like in Excel 2013 on Windows 7 (same as above with the PtrSafe keyword added):
Option Explicit

Private Declare PtrSafe Function SimplyMultiplyTestEXL Lib "C:\myProject\Debug\myDLL.dll" (ByVal x As Double, ByVal y As Double) As Double
Sub testTheDLL()

    Dim a As Double
    Dim b As Double
    Dim c As Double
   
    a = 6.1
    b = 2.5
   
    c = SimplyMultiplyTestEXL(a, b)

End Sub

When I run the code in Excel 2010 in the VBA debugger (Windows XP), c = 15.25, as expected.  However, when I run the code in Excel 2013 in the VBA debugger (Windows 7) I get the error message:
Run-time error '48':
Error in loading DLL

Any thoughts on how to fix this?  I've been looking around to see if this is a 32-bit vs 64-bit issue but various things on the web imply that all I need to do is add the PtrSafe keyword to resolve this issue (described succinctly here: http://stackoverflow.com/questions/5506912/how-should-i-make-my-vba-code-compatible-with-64-bit-windows).
0
Comment
Question by:e_livesay
2 Comments
 
LVL 44

Accepted Solution

by:
AndyAinscow earned 500 total points
ID: 40408060
I think it is (as you suspect) a 32/64 bit issue.  The XP is almost certainly 32 bit and the Win 7 is very likely to be 64 bit.  As the code originally runs on XP (32 bit) then it will be built as 32 bit.  The Excel 2013 on Win 7 however is very likely to be the 64 bit versions and you then run into trouble.

The simplest you can do is to recompile the dll as a 64 bit version.
0
 

Author Comment

by:e_livesay
ID: 40409392
Converting my MSVS 2010 C++ DLL to be 64-bit solved this problem.  Here is a link to the instructions that I used to do this:
http://msdn.microsoft.com/en-us/library/9yb4317s.aspx
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Workbook link problems after copying tabs to a new workbook? David Miller (dlmille) Intro Have you either copied sheets to a new workbook, and after having saved and opened that workbook, you find that there are links back to the original sou…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to use the return statement in functions in C++. The video will also teach the user how to pass data to a function and have the function return data back for further processing.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

919 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now