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
651 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

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

A little background as to how I came to I design this code: Around 5 years ago I designed an add-in that formatted Excel files to a corporate standard, applying different cell colours and font type depending on whether the cells contained inputs,…
This article will guide you to convert a grid from a picture into Excel format using Microsoft OneNote and no other 3rd party application.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.
This Micro Tutorial will demonstrate how to use a scrolling table in Microsoft Excel using the INDEX function.

757 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

13 Experts available now in Live!

Get 1:1 Help Now