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后完美运行

参考技术A :档案信息化建设的目标就是在现代化的技术条件下,一方面促进档案本身信息进入社会交流系统,在社会中广为传播,另一方面就是将档案中的信息与其他社会信息形式融合使用,在社会中传播,广泛地服务于社会。只有档案信息化建设与社会信息化同步发展,为促进国民经济和社会发展,才能确保提供快捷有效的档案信息服务。 参考技术B Public改成Private就可以调用了,另外VBA的boolean与Delphi类型格式不一样,传递无意义,必须用整形、浮点或字符串。改成long对integer后完美运行本回答被提问者采纳 参考技术C 办得到,但是要修改VB(因为它本来不行)
这里有详细说明和修改文件下载

要从 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生成)的主要内容,如果未能解决你的问题,请参考以下文章

易语言如何调用指定DLL文件?

调用 DLL,然后调用 API

如何开发通达信,东方财富,飞狐等股票dll插件呢?

创建可在另一种语言上调用的 win32api(dll) [关闭]

在浏览器上如何调用本地的资源

如何在 C#/Python 中从 DLL 调用函数