delphi - 在 Delphi 错误缓冲区中调用函数 DLL
问题描述
我有这 4 个可能在 c++ 中创建的 dll 函数,其中我有在 c++ 和 Visual Basic 中调用这些函数的示例。
我必须在 delphi(Delphi 7 和 Delphi 10.4)中使用这些函数。VbOpen、VbClose 和 VbWrite 工作得很好,但我无法让 VbRead 工作。
我已经将这些函数声明如下:
function VbOpen(_1: Integer;_2: LongInt;_3: BYTE;_4: BYTE;_5: BYTE;_6: BYTE;var _7: LongInt): Integer; stdcall;
function VbClose(var com:LongInt):Integer ; stdcall;
function VbWrite(var Command:AnsiString; var _3: LongInt): Integer; stdcall ;
function VbRead(var pBufOut : PAnsiChar ; var nBufferSize : LongInt;var _3: LongInt): integer; stdcall;
//
Call to VbRead
r:=VbOpen(5,...,...,...,...,,.);
if r=0 then
begin
//
IpCommand := '1009';
r:=VbWrite(IpCommand,errorCode);
// Visual Basic
GetMem(pBufOut,100);
r:=VbRead(pBufOut, pByteRead, errorCode);
if r=0 then
begin
if pByteRead > 0 then
begin
SetString(resultString, pBufOut, pdwByteRead);
end;
end;
end;
VbClose(errorCode); // Closes the connection and frees the used memory
VbRead resultString 的结果是垃圾字符,但 pByteRead 字节像正确值一样返回。
我有工作 exe 文件的 Visual Basic 示例
Dim vReturn As Long
Dim vCodeErr As Long
Dim vRetByte As Long
Dim s As String
Dim strOut As String
Dim pBufOut(1000) As Byte
Dim i As Long
s = "1001" // comand code
vReturn = VbWrite(s, vCodeEr)
vReturn = VbRead(pBufOut(),vRetByte, vCodeEr)
' Close Com Port
vReturn = VbClose(vCodeEr)
i = 1
strOut = ""
While (i <= vRetByte)
strOut = strOut + String(1, pBufOut(i))
i = i + 1
Wend
来自 dll 的用户手册
Sintax DWORD VbRead(SAFERRAY** pBufOut, LPDWORD pByteRead, LPDWORD lpdwCodeError)
pBufOut 读取的字节地址 pByteRead 读取的字节数 lpdwCodeError 返回系统错误
错误隐藏在哪里?谢谢你的帮助
文森特
解决方案
您可能必须使用VarArrayCreate来分配空间。
var
Arr: Variant;
begin
Arr := VarArrayCreate([1000], varByte);
推荐阅读
- flutter - 添加带有导航抽屉颤振应用程序的后退箭头
- c++ - 在数组 C++ 中查找特定值
- swift - 从 Xcode 10.3 迁移到 Xcode 11+ 会中断 iOS 图表中覆盖函数的调用?
- python - Conda:如何将 python 包从基础环境安装到新环境
- c# - 信任链适用于 Windows,但不适用于 Firefox 和 macOS
- javascript - 垂直内容滚动继续没有标记
- cakephp - 具有不同表名和插件的 Cakephp 夹具
- javascript - 使用加载器在 JavaScript 中将 SASS 文件编译为 CSS 字符串
- ruby-on-rails - 带有哈希字段的 MongoId:MongoDB 和 Rails 的值不同
- bash - 检查shell脚本中一行中单词的完全匹配