Inn*_*rld 1 delphi dll memory-management pchar
这个共享内存的限制是真实的吗?\n我已经传递给 DLL 字符串长度大约 370 个字符,DLL 读取它没有问题。
\n\n我问,因为我将 PChar 从 DLL 返回到 EXE 程序。\n在 DLL 中我使用 GetMem() 函数,在 EXE 程序中我使用 FreeMem() 函数,并且
\n\n我可能会因编写而发生访问冲突 - 我调用导出函数,在其中使用构造函数,它可能会崩溃。
\n\n当我从 Exec 中删除 FreeMem 时,不会显示此 AV。也不总是显示它,它取决于 PChar 变量中的字符:
\n\n255 xa - 可以通过\n但是\xc4\x85\xc5\x82\xc4\x87\xc5\x82\xc4\x85\xc5\x82\xc5\x82\xc4\x85\xc5\x82\xc5\x9b\xc4\ x87 \xc5\x82\xc4\x85\xc5\x9b\xc4\x87\xc4\x87\xc5\x82\xc5\x82\xc4\x87 :// 可能会崩溃。
\n\n示例 - 在 DLL 中创建消息:
\n\nfunction TPDF.wiadomosciBledow(kod: kodyBledow): TWynik;\nvar\n tmp: string;\n\nbegin\n\n case kod of\n kbOK: tmp := ''; //natomiast tutaj tego nie zauwa\xc5\xbcy\xc5\x82em\n kbBladLogowania: tmp := 'Nie mo\xc5\xbcna zalogowa\xc4\x87 si\xc4\x99 do serwera Archiwum';\n kbBrakAdresSerwera: tmp := 'Wprowad\xc5\xba adres serwera, np.: http://arch.lpwik:5984/';\n kbBrakDanychJSON: tmp := 'Wprowad\xc5\xba dane do logowania w formacie JSON - API _session';\n kbBladPobrania: tmp := 'Nie mo\xc5\xbcna pobra\xc4\x87 wskazanego pliku';\n kbBrakURL: tmp := 'Wprowad\xc5\xba adres URL do pobrania, np.: http://arch.lpwik:5984/baza/dok_1/zal_1.pdf';\n kbBrakProtokolu: tmp := 'Wymagane jest wprowadzenie protoko\xc5\x82u http:// lub https://'; //z jakiego\xc5\x9b powodu wprowadzenie tutaj dw\xc3\xb3ch slashy // powoduje b\xc5\x82\xc4\x85d\n end;\n\n result.kod := ord(kod);\n GetMem(result.wiadomosc, sizeof(WideChar) * Length(tmp) + 1);\n result.wiadomosc := StrPCopy(result.wiadomosc, tmp);\nend;\nRun Code Online (Sandbox Code Playgroud)\n\n并在 Exec freemem 中:
\n\nprocedure TOkno.pokazPDFClick(Sender: TObject);\nvar\n wejscie: TZalacznik;\n wyjscie: TWynik;\n t: string;\n\nbegin\n if @wyswietlPDF = nil then exit();\n\n {inicjalizacja pami\xc4\x99ci - widechar na jeden znak potrzebuje 2 bajty}\n GetMem(wejscie.pelnyAdresURL, 2 * Length(adresURL.Text) + 1);\n\n {przekopiowanie danych}\n StrPCopy(wejscie.pelnyAdresURL, adresURL.Text);\n\n {wywo\xc5\x82anie metody z DLL}\n wyjscie := wyswietlPDF(wejscie); //dll function\n\n {wy\xc5\x9bwietlenie wyniku w grupie}\n wynikKod.Caption := IntToStr(wyjscie.kod);\n wynikWiadomosc.Caption := wyjscie.wiadomosc;\n\n {zwalnianie przydzielanej pami\xc4\x99ci}\n FreeMem(wejscie.pelnyAdresURL);\n\n FreeMem(wyjscie.wiadomosc); //if commented I do not have AV\nend;\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |