gpt4 book ai didi

delphi - 德尔福DLL PChar

转载 作者:行者123 更新时间:2023-12-03 19:27:43 24 4
gpt4 key购买 nike

sharedMemory的此限制是实际的吗?
我已经传递给DLL字符串长度约370个字符,并且DLL毫无问题地读取了它。

我问,因为我将PChar从DLL返回到EXE程序。
在DLL中,我使用GetMem()函数,在EXE程序中,我使用FreeMem()函数,并且

我可以写出违反Acces的违规行为-我在使用构造函数的地方调用了导出函数,它可能会崩溃。

当我从Exec中删除FreeMem时,未显示此AV。同样也不总是显示它,它取决于PChar变量中的字符:

255 x a-可以通过
但是+/-会崩溃。

示例-在DLL中创建消息:

function TPDF.wiadomosciBledow(kod: kodyBledow): TWynik;
var
tmp: string;

begin

case kod of
kbOK: tmp := ''; //natomiast tutaj tego nie zauważyłem
kbBladLogowania: tmp := 'Nie można zalogować się do serwera Archiwum';
kbBrakAdresSerwera: tmp := 'Wprowadź adres serwera, np.: http://arch.lpwik:5984/';
kbBrakDanychJSON: tmp := 'Wprowadź dane do logowania w formacie JSON - API _session';
kbBladPobrania: tmp := 'Nie można pobrać wskazanego pliku';
kbBrakURL: tmp := 'Wprowadź adres URL do pobrania, np.: http://arch.lpwik:5984/baza/dok_1/zal_1.pdf';
kbBrakProtokolu: tmp := 'Wymagane jest wprowadzenie protokołu http:// lub https://'; //z jakiegoś powodu wprowadzenie tutaj dwóch slashy // powoduje błąd
end;

result.kod := ord(kod);
GetMem(result.wiadomosc, sizeof(WideChar) * Length(tmp) + 1);
result.wiadomosc := StrPCopy(result.wiadomosc, tmp);
end;


在Exec freemem中:

procedure TOkno.pokazPDFClick(Sender: TObject);
var
wejscie: TZalacznik;
wyjscie: TWynik;
t: string;

begin
if @wyswietlPDF = nil then exit();

{inicjalizacja pamięci - widechar na jeden znak potrzebuje 2 bajty}
GetMem(wejscie.pelnyAdresURL, 2 * Length(adresURL.Text) + 1);

{przekopiowanie danych}
StrPCopy(wejscie.pelnyAdresURL, adresURL.Text);

{wywołanie metody z DLL}
wyjscie := wyswietlPDF(wejscie); //dll function

{wyświetlenie wyniku w grupie}
wynikKod.Caption := IntToStr(wyjscie.kod);
wynikWiadomosc.Caption := wyjscie.wiadomosc;

{zwalnianie przydzielanej pamięci}
FreeMem(wejscie.pelnyAdresURL);

FreeMem(wyjscie.wiadomosc); //if commented I do not have AV
end;

最佳答案

主机可执行文件和DLL具有内存管理器的两个单独副本。

要像这样共享内存,您需要使用shared memory manager

作为替代方案,您可以重新设计API,以便分配和释放都仅在一侧发生,要么都在DLL中(公开要释放的函数),要么在主机可执行文件中都公开(公开要返回所需缓冲区大小的函数,并让调用者分配和取消分配)。

关于delphi - 德尔福DLL PChar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510753/

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