首页 > 解决方案 > 在 Delphi 错误缓冲区中调用函数 DLL

问题描述

我有这 4 个可能在 c++ 中创建的 dll 函数,其中我有在 c++ 和 Visual Basic 中调用这些函数的示例。

我必须在 delphi(Delphi 7 和 Delphi 10.4)中使用这些函数。VbOpen、VbClos​​e 和 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 返回系统错误

错误隐藏在哪里?谢谢你的帮助

文森特

标签: delphidllimport

解决方案


您可能必须使用VarArrayCreate来分配空间。

var
  Arr: Variant;
begin
  Arr := VarArrayCreate([1000], varByte);

推荐阅读