gpt4 book ai didi

delphi - 读取TMemoryStream时出现访问冲突错误

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

我在读取 TMemoryStream 时收到“访问冲突”错误。

        with Dataset do
begin
Edit;
FieldByName('FK_ID').AsInteger := aID;
FieldByName('FINGERNO').AsInteger := aFP.FPIndex;
FieldByName('FINGERTEMPLATE').AsString := aFP.FPBuffer; {This works fine}
TBlobField(FieldByName('FINGERTEMPLATE')).LoadFromStream(aFP.FPData); {Access Violation Error}

ApplyUpdates(0);
end;

这是获取 TMemoryStream (FPData) 的代码。

type
TFingerPrint = record
FPIndex : integer;
FPData : TMemoryStream;
FPBuffer : String;
end;

function TMachine.SetFingerPrintStream(
EmployeeRecord : PEmployeeRecord; EmployeeFP : PFingerPrint): PEmployeeRecord;
var
sbuffer: ansistring;
FPIndex,i : Integer;
FPList, FPDetailedList, BufferList : TStringList;
FingerprintStream: TMemoryStream;
FingerPrint: array of Byte;
FingerPrintLength: Integer;
pfilter : PAnsiChar;
Adata : String;
Writer: TBinaryWriter;
begin
EmployeeRecord.Fingerprints := TList.Create;
FPList := TStringList.Create;
FPDetailedList := TStringList.Create;
FPDetailedList.StrictDelimiter := True;
FPDetailedList.Delimiter := ',';

// BufferList := TStringList.Create;

pfilter := pAnsiChar(AnsiString('Pin=' + EmployeeRecord.EnrollNumber));
sbuffer := GetTurnsileDeviceInfo('templatev10','*',pfilter,'');

// BufferList.Add(sbuffer);
// BufferList.SaveToFile('C:\BufferText.txt');

try
FPList.Text := sbuffer;
for FPIndex := 1 to FPList.Count -1 do
begin
FPDetailedList.DelimitedText := FPList[FPIndex];

FingerprintStream := TMemoryStream.Create;
try
AData := FPDetailedList[5];

Assert(AData <> '');
i := 1;
while i <= Length(AData) do
if AData[i] = #0 then
Delete(AData, i, 1)
else
Inc(i);

FingerPrintLength := Length(AData);
SetLength(FingerPrint, FingerPrintLength);
Writer := TBinaryWriter.Create(FingerprintStream);
try
Writer.Write(TEncoding.Default.GetBytes(AData));
finally
Writer.Free;
end;

//FingerprintStream.SaveToFile('C:\StreamTest.txt');

new(EmployeeFP);
EmployeeFP.FPIndex := FPIndex -1;
EmployeeFP.FPData := FingerprintStream;
EmployeeFP.FPBuffer := sbuffer;
EmployeeRecord.Fingerprints.Add(EmployeeFP);
finally
FingerprintStream.Free;
end;
end;
finally
FPList.Free;
FPDetailedList.Free;
// BufferList.Free;
Result := EmployeeRecord;
end;
end;

缓冲区/流数据示例(BufferText.txt):

SutTUzIxAAADqKsECAUHCc7QAAAbqWkBAAAAg1UiYagaAO0PnADtAHCnwQA0AAsPQQA7qPYPYQBPACgPh6hfAP0PbACkAGWnlgB3AHAPmgB/qF4PSACFACEPZaiVAOQPjwBkAGGn6QCoACsPLwC8qKYPbwDCABkPfajTAOYPpgAkAHmmiADlAPoOJwDkqJwPfADwADQPVKjyAOQPzgAxAJWmQQD5AOwPBQD4qIsNYgAIATcPtKgLAQcNxQDIAYqlXAAcAf4PEwAdqYUPmQAgAcAPR6gpAQAPxADpAYKmqQBDAQQOdgBHqYMOsvvXAVp/dtcfamN7BpoyF9y7cIfK/vIPeImlWn/7AZqqjIMKxtEUam4ItnSfE6SkkH5Vfvb4SIaxqX6BUYYyAW+H5V+vg3+IkYZek6Q/lH4iDi8TAPrNT4Z8PQ7F7hv0gisr8ZaX6Qj0FoIrTApOFq76sPhRpPMByfYR+l/1WqTU+jkPiQpj/blb5PRNhC0BHPU+unMBgYBRfJ9wgiysARkGTQ00Az22YAad/pZ9pwGtqqOHbQdiE/oU5lZYA8L4gIenhS2qgYPZA6Z/whFT6QEgLwEB7d+CBqh4AW3CbgjFwwQkipYIAMQSVYmKowHJHYx1wQTBwtAIAJglesMEZnCkAccljH6Wr8EHqKEpAEQKAF0sdGz8iVoFALv2hpOjAWNO6TDAOvz9av4LAIdd+uz/PJ8TAOdek/8G/cBpwn7BeMJVwgBry2ZvVgUAk7J0wSASAPd4on8G/sI/d4RrDgBjvOL9aPowwP3A/44GA/N9YsDCZQfFXoP2clkQAPOAW23AxMDEwMJJBMWLocyCEwDkpKAFaZNuwMHCwlVKxgDkBCj+FQD3rGHBw2lmiMOWdMCIFQNCvadqwcHBBqTBV8LBTDgLAEXQ3Vf7+vzBwMG0FgNc0qnCSsGMZsLC08H/QBYA9yenbmhzxMKnwYU6Qwyo3ueeSo6xgsAWqPTrp8HBQgSPw27DwcMxSRPF7u4KWsH/wcTDAsLCV8DA/0AJAETv92j6QF0PAMo3l8NowcfFwf/BOzrDpwFb9OltwDj5/8xrBgCp94kGeQe4uQIGNgYQdQSFaJEDEF4JdAUPE5kYA8HDQkA7wcKaCBBiHPf9B/5UagcQniEGVgcKE+Al+v5W//1QDRPgKgNZ/sFaBv38rhE0MgZm/8IQi5MC/8P8xP/JED6XB2vAYMFXyRA74wFUwVJgCtVAVqHC/0Np

我也尝试将 MemoryStream 转换为不同的编码(ASCII、UTF8、ANSI),但仍然收到错误。

最佳答案

看看这个:

EmployeeFP.FPData  := FingerprintStream;

接下来是:

FingerprintStream.Free;

您已经销毁了流,因此 FPData 引用了一个已被销毁的对象。您的运行时错误就是由此造成的。

您需要确保该流对象的生命周期足以满足您对它的所有使用。

您的代码相当长并且有些复杂。可能还有其他错误,但我没有搜索过。

关于delphi - 读取TMemoryStream时出现访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34987008/

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