Entwickler-Ecke
Dateizugriff - Problem mit TStringList in DLL
Mike_C - So 02.03.03 18:50
Titel: Problem mit TStringList in DLL
Hi!
Ich habe eine Procedure, die als Parameter SHORTSTRINGS und eine TStringList hat. Diese Porcedure befindet sich in einer DLL.
Wenn ich diese Procedure aufrufe, bekomme ich die Fehlermeldung
Cannot assign a TStringList to a TStringList" (so oder so ähnlich)
Woran liegt das?
AndyB - So 02.03.03 19:52
Also dass die Meldung so lautet kann ich nicht gauben. Ein bischen Code wäre nicht schlecht (Copy&Paste ins Forum), denn dann kann man den Fehler schneller finden.
| Zitat: |
| Diese Porcedure befindet sich in einer DLL. |
Da du eine Stringliste übergibst muss ich die Frage stellen, ob du auch die Unit ShareMem in die DLL und in das Hauptprogramm (.dpr) als 1. Unit eingetragen hast.
Mike_C - So 02.03.03 20:02
Gibt's ne Möglichkeit ShareMem zu umgehen?
Klabautermann - So 02.03.03 20:07
Hallo,
| Mike_C hat folgendes geschrieben: |
| Gibt's ne Möglichkeit ShareMem zu umgehen? |
Nur wenn du den Inhalt der Stinglist zu pChar konvertierst und diesen dann übergibst.
Gruß
Klabautermann
Mike_C - So 02.03.03 20:08
OK, das wird länger... (Der Source Code)
DLL...
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:
| var id_SMTP: TIDSMTP; id_Message: TIDMESSAGE;
procedure ConfigMail(OutMail, UIN, Password: shortstring; const Filename: shortstring);stdcall; var F: TExtFile; begin InitCoder; Assign(F, Filename); Rewrite(F); WriteLn(F, Encode(OutMail)); WriteLn(F, Encode(UIN)); WriteLn(F, Encode(Password)); CloseFile(F); end;
procedure StartMailer(const Filename: shortstring);stdcall; var F: TextFile; s: shortstring; begin id_SMTP := TIDSMTP.Create(Application.MainForm); InitCoder; AssignFile(F, Filename); Reset(F); ReadLn(F,S); id_SMTP.Host := Decode(s); ReadLn(F,S); id_SMTP.Username := Decode(s); ReadLn(F,S); id_SMTP.Password := Decode(s); id_SMTP.Port := 25; CloseFile(F);
id_Message := TIDMESSAGE.Create(Application.Mainform); end;
procedure ReleaseMailer;stdcall; begin id_SMTP.Free; id_Message.Free; end;
function SendEmail(Sender, Recipient:shortstring;CCList:shortstring; sSubject:shortstring;Body:TStringList):boolean;stdcall; begin id_Message.From.text := Sender; id_Message.Sender.text:=id_Message.From.text;
id_Message.Recipients.EMailAddresses:= Recipient; id_Message.CCList.EMailAddresses := CCList; id_Message.Subject:=sSubject;
id_Message.Body.Clear; id_Message.Body := Body;
try id_SMTP.Connect; id_SMTP.Send(id_Message); id_SMTP.Disconnect; result:=True; except on E : Exception do begin if id_SMTP.connected then try id_SMTP.disconnect; except end; result := false; end; end; end; |
Im Programm
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm2.btnSendMailClick(Sender: TObject); var s: TStringlist; i, Fehler: integer; MMessage: TMAPIMessage; begin s := TStringlist.Create; s.Text := Memo1.Text; s.Add('I tried the following:'); if Checkbox1.Checked then s.Add(checkbox1.Caption); if Checkbox2.Checked then s.Add(checkbox2.Caption); if Checkbox3.Checked then s.Add(checkbox3.Caption); if Checkbox4.Checked then s.Add(checkbox4.Caption); if Checkbox5.Checked then s.Add(checkbox5.Caption); s.Add('but the error still occurs.'); s.SaveToFile(ExtractFilePath(Application.Exename)+'Body.txt');
StartMailer(ExtractFilePath(Application.Exename)+'sndmail.cfg'); SendEMail('gameforge@cheatha.de',Edit1.Text,'','Error Report (CSS-Edit)',s); ReleaseMailer; s.Free; end; |
Ich hab auch ShareMem als 1.Unit in DLL und Hauptprogramm (.dpr) eingebunden...
Mike_C - So 02.03.03 20:11
@Klabautermann:
Ich glaube, das wird mit in meinem Fall nichts nützen, oder?
Ich muss dann ja wieder den PChar als Stringlist im Message.Body schreiben
edit:
BZW:
Würde es so funzen?
Quelltext
1: 2:
| SendEmail(Param1, Param2,Param3,Param4,PChar(st.text)); //Param1-4 stehen für Sender, Empfänger, CCList und Subject |
und in sendemali selbst
Quelltext
1: 2: 3:
| ... id_Message.Body.text := Body; ... |
Klabautermann - So 02.03.03 20:16
Hallo,
| Mike_C hat folgendes geschrieben: |
| Ich muss dann ja wieder den PChar als Stringlist im Message.Body schreiben |
das ist kein Problem, da ja tStrings.Text die komplette liste als string enthällt. Du kannst diese Eigenschaft sowohl auslesen als auch setzen. Einen String kannst du wierderum einfach in einen pChar konvertieren und andersrum ist es auch kein Problem.
Alternativ kannst du auch tString.CommaText verwenden.
Gruß
Klabautermann
Mike_C - So 02.03.03 20:18
thx, ich probier's mal
:D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!