DLL函数的“正常”声明语句看起来像这样:
Declare Sub subName Lib "path_to_lib" _
Alias "aliasName" _
(...)
在我的应用程序中,最好让用户选择其库位置,然后再将该位置写入单元格中。我想将此值传递给“ path_to_lib”参数,但是提取单元格值有困难。
我尝试将单元格值分配给全局变量,例如pathVariable并编写:
Declare Sub subName Lib " & pathVariable & " _
Alias "aliasName" _
(...)
但是返回错误:找不到文件:&pathVariable&
我还尝试了双引号,返回了错误:File Not Found“&pathVariable&”
然后我尝试了三重引号,VBA有用地将其简化为双引号,给了我同样的错误。
这里有一些特殊的句法酱吗?甚至替代方法?还是应该放弃此(有用的)功能?
答案 0 :(得分:2)
不能。模块的(declarations)部分中的所有内容都只能是 declarative 语句,这些语句不可执行:变量在声明性上下文中没有任何意义,不能有一个价值。尽管可以想象Const
可以工作,但是如果尝试运行,则会出现编译错误:VBA将仅接受字符串文字。
答案 1 :(得分:2)
我接受了Mathieu的回答,因为它可以直接回答我的问题。
但是,对于任何想知道如何解决动态dll位置问题的用户,我有以下解决方案:
调用dll时,系统首先搜索当前工作目录,然后搜索用户和环境路径变量。我发现很难修改用于dll调用的path用户变量,因此我通过添加以下内容来利用第一部分:
ChDir (dllFolder)
在dll调用之前。声明语句可以像以前一样保留,只是库名用引号引起来:
Declare Sub subName Lib "DLLName.dll" _
Alias "aliasName" _
(...)
如果程序的其他部分希望位于某个目录中,请随时跟踪上一个目录,并在调用后将其改回。
答案 2 :(得分:0)
虽然不能用这种方式声明,但至少可以加载库和函数。
hDLL = LoadLibrary(myDLL)
hProc = GetProcAddress(hDLL, "myProcName")
所以现在我们有了一个指向函数的指针。调用该函数有点麻烦,但您可以使用 DispCallFunc
来执行此操作。
如前所述,这有点乱LaVolpe on the vbforums made a neat class for this kind of thing
Private cMyDLL as cUniversalDLLCalls
set cMyDLL = new cUniversalDLLCalls
'... later ...
cMyDLL.CallFunction_DLL(myDllPath, "myMethodName", hasStrinParams, returnType, CC_STDCALL, param1, param2, param3, ...)
警告:
此类仅在 Windows 操作系统上受支持