У меня есть 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-библиотеках?
Заранее спасибо за помощь!