Вызов C DLL в 64-битном Excel для использования в VBA - PullRequest
1 голос
/ 03 декабря 2011

Мне нужно вызвать DLL в 64-битном Excel для использования в VBA.я.) Мне сказали, что я не могу использовать 32-битную DLL в 64-битной программе, это правда?ii. Кто-нибудь знает пример, который, как он знает, работает, демонстрируя загрузку dll в VBA.

На данный момент они даже не загружаются.Я могу вызвать библиотеку DLL изнутри C ++.

Пример кода выглядит следующим образом и прекрасно компилируется в 64-битном режиме.Я попытался зарегистрировать функцию.Ошибка VBA: «ошибка компиляции: ожидаемая библиотека»

Ошибка вызывающей функции в VBA

Public Declare PtrSafe Function getNumber_Lib "C:\Users\james.allsop\Documents\Visual Studio 2010\Projects\DynamicLibrary\x64\Debug\MathFuncsDll.dll" () As Integer

Следующие все компилируются и запускаются.

MathFuncsDll.h

// MathFuncsDll.h
// Returns a + b
__declspec(dllexport) double Add(double a, double b);
// Returns a - b
__declspec(dllexport) double Subtract(double a, double b);
// Returns a * b
__declspec(dllexport) double Multiply(double a, double b);
// Returns a / b
// Throws DivideByZeroException if b is 0
__declspec(dllexport) double Divide(double a, double b);
__declspec(dllexport) double getNumber();

MathFuncsDll.cpp

#include "MathFuncsDll.h"
double Add(double a, double b)
{
  return a + b;
}

double Subtract(double a, double b)
{
  return a - b;
}

double Multiply(double a, double b)
{
  return a * b;
}

double Divide(double a, double b)
{
  if (b == 0)
  {
    return -1.0;
  }
  return a / b;
}

double getNumber()
{
    return 1000;
}

MyExecRefsDll.cpp

// MyExecRefsDll.cpp : Defines the entry point for the console application.
//
// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib

#include <iostream>
// Returns a + b
__declspec(dllimport) double Add(double a, double b);

// Returns a - b
__declspec(dllimport) double Subtract(double a, double b);

// Returns a * b
__declspec(dllimport) double Multiply(double a, double b);

// Returns a / b
// Throws DivideByZeroException if b is 0
__declspec(dllimport) double Divide(double a, double b);
__declspec(dllimport) double getNumber();

int main()
{
    double a = 7.4;
    int b = 99;
    std::cout << "a + b = " << Add(a, b) << "\n";
    std::cout << "a - b = " << Subtract(a, b) << "\n";
    std::cout << "a * b = " << Multiply(a, b) << "\n";
    std::cout << "a / b = " << Divide(a, b) << "\n";
    return 0;
}

Любая помощь будет принята с благодарностью!Джеймс

1 Ответ

2 голосов
/ 03 декабря 2011

Ваша декларация в VBA содержит ошибку.Это должно быть:

Public Declare PtrSafe Function getNumber Lib "C:\Users\james.allsop\Documents\Visual Studio 2010\Projects\DynamicLibrary\x64\Debug\MathFuncsDll.dll" () As Integer

вместо:

Public Declare PtrSafe Function getNumber_Lib "C:\Users\james.allsop\Documents\Visual Studio 2010\Projects\DynamicLibrary\x64\Debug\MathFuncsDll.dll" () As Integer

Обратите внимание на удаленное подчеркивание.

И да, вы не можете вызывать 32-битные DLL из 64-битныхприложения и наоборот.Это общее ограничение для всех приложений, а не только для VBA или Excel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...