【发布时间】:2019-04-18 09:17:02
【问题描述】:
我尝试在 Visual Studio 上创建一个 C++ DLL。我想从 VBA (Excel) 调用这个 DLL。我创建了 3 个函数 DllRegisterServer()、DllUnregisterServer()、runApp()。
当我运行 regsvr32 DLL1.dll(我的 DLL 的名称)时,DLLRegisterServer() 函数运行良好。 runApp() 函数是我的测试函数。
但是从 VBA 调用我的 DLL 时出现错误:
在 Visual Studio 中,我创建了一个动态链接库 (DLL) 项目。
这是我的 DLL1.cpp:
#include "stdafx.h"
#include "Dll1.h"
DWORD __stdcall DllRegisterServer() {
int msgboxID = MessageBox(
NULL, (LPCWSTR)L"Dans DLLRegisterServer", (LPCWSTR)L"Test",MB_OK |
MB_ICONWARNING);
return 0;
}
DWORD __stdcall DllUnregisterServer() {
return 0;
}
DWORD __stdcall runApp() {
int msgboxID = MessageBox(
NULL,
(LPCWSTR)L"Fonction runApp", (LPCWSTR)L"Test_App",
MB_OK | MB_ICONWARNING
);
return 0;
}
这是我的 DLL1.h:
#pragma once
#include <windows.h>
extern "C" DWORD __stdcall DllRegisterServer();
extern "C" DWORD __stdcall DllUnregisterServer();
extern "C" DWORD __stdcall runApp();
这是我的 Source.def:
LIBRARY
EXPORTS
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
runApp
我的 DLL 构建良好,没有错误也没有警告。
我将 VBA 项目放在与 DLL1.dll 文件相同的文件夹中。
这是我的 VBA 脚本:
Option Explicit
Public Declare PtrSafe Function runApp Lib "Dll1.dll" () As LongPtr
Public Sub testRunApp()
Dim lRetCode As LongPtr
lRetCode = runApp
MsgBox "runApp a retourné le code " & lRetCode, vbOKOnly Or vbSystemModal Or vbInformation, "test de DLL"
End Sub
怎么办?
【问题讨论】:
-
如果您不使用完整路径 (c:\foo\bar\baz\dll1.dll),那么您必须将 DLL 放在 Excel 可以找到的位置。没有多少吸引人的位置,c:\windows 和 PATH 都很丑。考虑将其放在 Office 安装文件夹中,即存储 Excel.exe 的相同位置。
-
您的 dll 似乎没有导出 COM 对象,因此您不需要注册它(这样做对您毫无用处)。
runApp应该在 VBA 端声明为As Long,因为这就是DWORD。否则,除非您提供到Dll1.dll的完整路径,否则您需要将其放在searched directories 之一中,或者在第一次调用runApp之前调用SetDllDirectory。
标签: c++ excel vba visual-studio dll