Autor Beitrag
1aa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Win Vista, Win8
Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Mo 28.01.08 21:09 
user profile iconjaenicke 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Win Vista, Win8
Delphi 2007
BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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..4095of char;
  ResStr : string;
  hSession, hfile: hInternet;
  dwindex,dwcodelen,dwread,dwNumber: cardinal;
  dwcode : array[1..20of 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 <>0do 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47
Erhaltene Danke: 1

Win Vista, Win8
Delphi 2007
BeitragVerfasst: 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...