Autor |
Beitrag |
1aa
      
Beiträge: 47
Erhaltene Danke: 1
Win Vista, Win8
Delphi 2007
|
Verfasst: Sa 26.01.08 17:10
Ich will an eine DLL einen String übergeben den soll die Dll bearbeiten und dann zurückliefern...
Ich erhalte aber immer die Fehlermeldung:
"Im Projekt Project1.exe ist eine Exception der Klasse EInvalidPointer aufgetreten. Meldung:'Ungültige Zeigeroperation'.Prozess wurde angehalten...."
woran könte das leigen?
Zuletzt bearbeitet von 1aa am Mi 30.01.08 17:29, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 26.01.08 17:28
Wenn du eine DLL neu erstellst, dann fügt Delphi einen Hinweis am Anfang der DLL ein. Hast du den Hinweis (ShareMem betreffend) gelesen und beachtet?
Ich würde aber generell davon abraten mit Strings als Parametern für Funktionen oder Prozeduren in DLLs zu verwenden. Dafür ist PChar besser geeignet, auch wenn dies als Rückgabewert ein paar Zeilen Quelltext mehr erfordert. Und wenn nicht sowohl die DLL als auch das Programm in Delphi geschrieben sind, dann geht es auch nur mit PChar.
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: Mo 28.01.08 21:09
jaenicke hat folgendes geschrieben: | Ich würde aber generell davon abraten mit Strings als Parametern für Funktionen oder Prozeduren in DLLs zu verwenden. Dafür ist PChar besser geeignet, auch wenn dies als Rückgabewert ein paar Zeilen Quelltext mehr erfordert. Und wenn nicht sowohl die DLL als auch das Programm in Delphi geschrieben sind, dann geht es auch nur mit PChar. |
Oder OleString?
twm
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 28.01.08 21:24
Damit müsste es klappen, aber ausprobiert habe ich das nicht. Der Punkt ist, dass der Speicher in der Hostanwendung reserviert werden muss, auch der für Rückgabewerte, weil ansonsten nach der Ausführung der Prozedur der Speicher, in den man geschrieben hat, ungültig wird (und man dann auf die zurückgebenen Daten nicht mehr zugreifen kann).
Sharemem bewirkt, dass statt der Standardbehandlung durch den "normalen" Speichermanager genau dies gemacht wird, wenn Strings benutzt werden. Bei OleString wird das soweit ich weiß ohnehin über einen entsprechenden MemoryManager abgehandelt, der OleStrings in dieser Hinsicht korrekt behandelt.
|
|
1aa 
      
Beiträge: 47
Erhaltene Danke: 1
Win Vista, Win8
Delphi 2007
|
Verfasst: Di 29.01.08 15:23
Also erstmal danke...
Das was in der DLL oben schon drinn steht hab ich beachtet und trotzdem komm der fehler..
Mal der Code der DLL:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| library Project2;
uses SysUtils, Classes,ShareMem, Forms, WinInet;
{$R *.res}
procedure GetHTML(AUrl: string); export; var databuffer : array[0..4095] of char; ResStr : string; hSession, hfile: hInternet; dwindex,dwcodelen,dwread,dwNumber: cardinal; dwcode : array[1..20] of char; res : pchar; Str : pchar; F : TextFile; begin ResStr:=''; if pos('http://',lowercase(AUrl))=0 then AUrl:='http://'+AUrl; hSession:=InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); If assigned(hSession) Then Try hfile:=InternetOpenUrl( hsession, pchar(AUrl), nil, 0, INTERNET_FLAG_RELOAD, 0); if assigned(hfile) then Try dwIndex := 0; dwCodeLen := 10; HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex); res := pchar(@dwcode); dwNumber := sizeof(databuffer)-1; if (res ='200') or (res ='302') then begin while (InternetReadfile(hfile,@databuffer,dwNumber,DwRead)) AND (dwRead <>0) do begin databuffer[dwread]:=#0; Str := pchar(@databuffer); resStr := resStr + Str; Application.ProcessMessages; end; end else ResStr := 'Status:'+res; Finally InternetCloseHandle(hfile); End; Finally InternetCloseHandle(hsession); AssignFile(F,'1.tmp'); Rewrite(F); Writeln(F, ResStr); CloseFile(F); End; end; | .
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.01.08 16:09
Nein, hast du nicht beachtet...
Da steht extra drin, dass ShareMem als erstes in der uses Liste sowohl der Anwendung wie auch der DLL stehen muss.
Gibt es einen Grund, warum du nicht UrlDownloadToFile oder ähnliches benutzt, um die Datei herunter zu laden?
|
|
1aa 
      
Beiträge: 47
Erhaltene Danke: 1
Win Vista, Win8
Delphi 2007
|
Verfasst: Mi 30.01.08 17:29
Danke jaja im detail liegt der Fehler...(Wer lesenkann ist klar im vorteil)
Weil ich nur den Quelltext brauche...
und diese Prozedure läuft für meine Zwecke am stabielsten...
|
|
|