Невозможно запустить C кодированную DLL в Excel VBA - PullRequest
1 голос
/ 19 апреля 2020

У меня есть Windows 10 64-разрядных, Office 2013 32-разрядных и с использованием MinGW64.

Я следовал инструкциям https://www.transmissionzero.co.uk/computing/building-dlls-with-mingw/

Я проверял другие потоки ответов в stackoverflow безуспешно.

Когда я запускаю код Excel VBA, я получаю следующее сообщение об ошибке: «Ошибка выполнения 48: файл не найден», но файл находится в папке, а папка имеет путь ссылка.

У меня есть Add. c со следующим кодом:

#include "add.h"
#include <windows.h>

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  switch (fdwReason)
  {
    case DLL_PROCESS_ATTACH:
      /* Code path executed when DLL is loaded into a process's address space. */
      break;

    case DLL_THREAD_ATTACH:
      /* Code path executed when a new thread is created within the process. */
      break;

    case DLL_THREAD_DETACH:
      /* Code path executed when a thread within the process has exited *cleanly*. */
      break;

    case DLL_PROCESS_DETACH:
      /* Code path executed when DLL is unloaded from a process's address space. */
      break;
  }

  return TRUE;
}

int ADDCALL Add(int a, int b)
{
  return (a + b);
}

/* Assign value to exported variables. */
int foo = 7;
int bar = 41;

Следующий код Add.h:

/* add_var.h

   Declares a function and variables to be imported by our application, and
   exported by our DLL.
*/

/* You should define ADD_EXPORTS *only* when building the DLL. */
#ifdef ADD_EXPORTS
  #define ADDAPI __declspec(dllexport)
#else
  #define ADDAPI __declspec(dllimport)
#endif

/* Define calling convention in one place, for convenience. */
#define ADDCALL __cdecl

/* Make sure functions are exported with C linkage under C++ compilers. */
#ifdef __cplusplus
extern "C"
{
#endif

/* Declare our Add function using the above definitions. */
ADDAPI int ADDCALL Add(int a, int b);

/* Exported variables. */
extern ADDAPI int foo;
extern ADDAPI int bar;

#ifdef __cplusplus
} // __cplusplus defined.
#endif

И следующий код VBA для проверки:

Option Explicit
Private Declare PtrSafe Function Add Lib "C:\exceladd2\AddLib.dll" (ByVal a As Integer, ByVal b As Integer) As Integer

Sub Test()
    Call MsgBox(Add(4, 5))
End Sub

Следующий код был скомпилирован с MinGW64 без ошибок и предупреждений:

x86_64-w64-mingw32-gcc-8.1.0 -c -o add.o add.c -D ADD_EXPORTS
x86_64-w64-mingw32-gcc-8.1.0 -o AddLib.dll add.o -shared -s -Wl,--subsystem,windows,--kill-at

Ниже приведен результат проверки зависимостей из библиотеки: https://pasteboard.co/J4zegPO.jpg

Я пытался скомпилировать с g cc 32 бит и другими версиями g cc 64 бит и получил ту же ошибку 48 в Excel.

По прошлому Я смог без проблем запустить подобную DLL, скомпилированную с g cc 32-битными в Windows 7 32-битными с Office 2010 32-битными. Запустил Excel VBA с и без PtrSafe без результата.

Что-то не так с кодом или компиляцией?

Знаете ли вы какое-либо программное обеспечение для устранения неполадок в DLL-библиотеках?

Заранее спасибо за помощь!

...