gpt4 book ai didi

delphi - 为什么从 dll 调用函数并且使用记录时出现访问冲突?

转载 作者:行者123 更新时间:2023-12-02 08:02:17 25 4
gpt4 key购买 nike

我尝试调用一个函数来从 C++ dll 中读取一些字节。我声明了函数头,但是当我调用并尝试将数组值分配给记录值时,函数在 MSVCR80.dll 中返回访问冲突。这是我的代码,如果我使用 valueBits 记录返回 AV 如果我使用一个简单的 bool 变量它正在工作。我需要建议。

    function TdmCustom.CheckBon(var valueBits: TStatusPrintingRecord): Boolean;
var cmd : String;
//valueBit : array[0..10] of AnsiChar;
MemArea : PAnsiChar;
pdwByteRead : LPDWORD;
lpdwSysError : LPDWORD;
aNrComanda : String;
Arr : array of AnsiChar;
begin
pdwByteRead := 0;
lpdwSysError := 0;
aNrComanda := '1011';
cmd := Format('%S',[aNrComanda]);
SendCommandToPrinter(cmd,True);
lastError := CEFReadB(MemArea, &pdwByteRead, &lpdwSysError)//acess violation if i use valueBits record
SetLength(Arr, Integer(pdwByteRead));
Move(MemArea^, Arr[0], Integer(pdwByteRead));
if lastError = 0 then begin
valueBits.S8_isBonFiscalDeschis := Arr[8] = '1';
//valueBits.S9_isBonNefiscalDeschis := Arr[9] = '1';
end;
Result := lastError = 0;
end;

这是我的 dll 函数头:

function CEFReadB(lpMemArea : PAnsiChar; var pdwByteRead : LPDWORD; var lpdwSysError : LPDWORD) : DWORD; cdecl; external DLLName name 'CEFReadCustom' delayed;

最佳答案

存在各种错误。

  1. 首先 & 在 Delphi 中意味着不同的东西。您可能需要@。
  2. 但是您不需要它,因为您声明了值 VAR。
  3. 但是你再次将它们声明为指针(LPdw*)。将它们声明为 VAR 会消耗间接寻址,因此在声明中,类型可能应该只是 DWORD。
  4. 在将内存传递给函数之前,您可能还需要为 memarea 分配内存
  5. 并传递在 byteread 中分配的数量。

我尝试清理,并提出了以下未经测试的代码。如果您需要更多帮助,请使用 C++ 声明和用法更新您的帖子。

function CEFReadB(lpMemArea : PAnsiChar; var byteRead : DWORD; var lpdwSysError : DWORD) : DWORD; cdecl; external DLLName name 'CEFReadCustom' delayed;

function TdmCustom.CheckBon(var valueBits: TStatusPrintingRecord): Boolean;
var cmd : String;

MemArea : ansistring;
LastError : DWORD;
ByteRead : DWORD;
SysError : DWORD;
aNrComanda : String;

begin
byteRead := 50;
setlength(memarea,byteread);
lpdwSysError := 0;
aNrComanda := '1011';
cmd := Format('%S',[aNrComanda]);
SendCommandToPrinter(cmd,True);
lastError := CEFReadB(pansichar(MemArea), byteRead, SysError);
if lasterror= 0 then
begin
setlength(memarea,byteRead);
if byteread>=9 then
begin
valueBits.S8_isBonFiscalDeschis := Arr[8] = '1'; // note 8 and 9 are 1-based!
valueBits.S9_isBonNefiscalDeschis := Arr[9] = '1';
end
else
exit(False); // not enough data read.
end;

Result := lastError = 0;
end;

关于delphi - 为什么从 dll 调用函数并且使用记录时出现访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com