ExcelVBA如何调用API DLL(Delphi生成)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ExcelVBA如何调用API DLL(Delphi生成)相关的知识,希望对你有一定的参考价值。
Public Declare Function plock Lib "passzy.dll" (ByVal s As String) As Boolean
Declare Function punlock Lib "passzy.dll" (ByVal s As String) As Boolean
在excel中执行的时候,提示第一行错误:编译错误,常数、固定长度字符串…………
我的delphi中声明:(DLL中包含窗体,其它没什么特别的了)
function punlock(s:pchar):boolean; stdcall;
function plock(s:pchar):boolean; stdcall;
编译好的dll,用delphi本身是可以完美调用的。
另外这个DLL无法regsvr32.exe注册,无法用VBA引用。请问我应该怎么做?
(已经解决了,无满意答案)Public改成Private就可以调用了,另外VBA的boolean与Delphi类型格式不一样,传递无意义,必须用整形、浮点或字符串。改成long对integer后完美运行
这里有详细说明和修改文件下载
要从 Delphi 调用的 C++ dll 函数 - 数组参数
【中文标题】要从 Delphi 调用的 C++ dll 函数 - 数组参数【英文标题】:C++ dll function to be called from Delphi - array parameter 【发布时间】:2021-08-26 06:20:40 【问题描述】:我需要编写 C++ dll 函数,参数之一是数组。但他的函数也会从 Delphi 代码中调用。所以我假设我不能只写 std::vector 或 std::array。 我现在已经开始阅读有关 Delph 的内容,但也许一些好心人会在这里为我指出正确的解决方案:)
【问题讨论】:
传递一个指向内存缓冲区的指针和这个缓冲区的大小。定义关于谁分配和释放缓冲区(调用者或被调用者)的规则。 使用简单的记忆而不是语言相关的类型,这些类型为您带来方便。提供一个示例,说明为什么它必须是一个数组。 @AndreasRejbrand 长度通常比大小更可取 @DavidHeffernan:我同意,应该是长度。 这里是一个您可能会发现非常有用的网站的链接:rvelthuis.de/articles/articles-dlls.html 【参考方案1】:数组不给出其元素的数量。因此,必须在进一步的参数/路由中提供该编号。
字符串是指针。因此,该值是间接传递的。 C++ 中不存在 Delphi 字符串。常用类型为 PChar/LPWSTR。
Generell 有必要找出哪种语言将提供内存以及何时释放内存。调用何时离开范围? Delphi无法释放内存,必须调用C++后从内存中读取值。
在数组的情况下,您必须在之后通知 C++ 可以释放内存。另一种方法是传递一个回调方法。调用模块(Delphi)可以通过回调依次构建自己的数组。
Delphi 函数默认使用 register 生成。因此将函数原型切换到stdcall。
type TFunc = function(var arr: integer; NewCount: integer): boolean; stdcall;
第一个数组元素的地址来自参数。因此,增加读指针以读出下一个数组元素。
var
Li : integer;
LpLfd : PInteger;
//lplfd : PInteger absolute arr;
begin
SetLength(Result, NewCount);
LpLfd := @arr; //instead of absolute
for Li := 0 to Pred(NewCount) do
begin
Result[Li] := LpLfd^;
inc(LpLfd, 1);
end;
end;
【讨论】:
"Delphi 函数默认使用 cdecl 生成。"不,默认是register
。
@AndreasRejbrand 谢谢以上是关于ExcelVBA如何调用API DLL(Delphi生成)的主要内容,如果未能解决你的问题,请参考以下文章