ďťż

Ładny brzuch

Mam jeszcze jedno pytanie co do DLL. Otóż w moim poprzednim pytanku zapytałem się o dwie rzeczy:
Oto jak się robi DLL w C++ i prośbę o przetłumaczenie kodu. Na pytanie pierwsze została udzielona
mi odpowiedź, z czego bardzo się cieszę. Kodu z mojego poprzedniego postu potrzebuje do programu w C++
i nie udało mi się go przetłumaczyć, więc wpadłem na pomysł zrobienia DLL'a w Delphi (gdzie ten
kod działa) i wykorzystanie tej biblioteki w C++ (jest to możliwe dzięki dyrektywie stdcall). No, więc
ładnie napisałem DLL'a i go zbudowałem, zaraz potem stworzyłem progsik, który też ładnie się skompilował.
Gdzie problem? Problem jest taki, że po kliknięciu na przycisk który ma wywołać prockę z biblioteki
pojawia się komunikat o błędzie o mniej więcej takiej treści: ...EOleSysError with message 'Funkcja
CoInitialize nie została wywołana'... Co to jest za błąd, i jak mogę go usunąć? Pod Delphi działa normalnie (bez DLL),
i sądze że nie jest to chyba spowodowane przesiadką z D6 na D7. (Delphi 6 na razie nie mam i nie mogę sprawdzić).
I gdyby ktoś się pytał, oto kod biblioteki DLL:

library Email;

uses
SysUtils, Variants,
ComObj, Registry;

{$R *.res}

procedure GetEmail;stdcall;
var
OutlookApp, Mapi, Personal, Contacts, Current: Variant;
I: Integer;
R: TRegistry;
begin
OutlookApp:= CreateOLEObject('Outlook.Application');
Mapi:= OutlookApp.GetNameSpace('MAPI');
Personal:= Mapi.Folders('Foldery osobiste');
Contacts:= Personal.Folders('Kontakty');

R:= TRegistry.Create;
try
R.OpenKey('SoftwareAdresy', True);
for i := 1 to Contacts.Items.Count do
begin
Current := Contacts.Items[i];
R.WriteString(IntToStr(I),Current.Email1Address);
end;
finally
OutlookApp.Quit;
OutlookApp:= Unassigned;
R.Free;
end;
end;

exports
GetEmail name 'GetEmail';

begin
end.

A to cały kod programu:

unit MailFrmU;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

procedure GetEmail;stdcall; external 'Email.dll' name 'GetEmail';

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
GetEmail;
end;

end.

Jeszcze jedno: Program najpierw próbowałem w Delphi, ale w C++ jest ten sam błąd,
- Zadaniem programu jest wyciągnięcie e-mail'i z Outlook'a (nie Outlook Express !) i zapisanie ich do rejestru



Wyglada na to, ze musisz wywolac funkcje CoInitialize. Za bardzo Ci nie pomoge, bo nie znam pascala, a tym bardziej delphi.
A czy probowales tego dlla utworzonego w delphi wywolac w programie napisanym w delphi i czy Ci to dzialalo. Jezeli nie dzialalo to musisz poszukac informacji na temat tworzenia dlli za pomoca delphi.

Jeżeli skopiuje kod do delphi to tam działa bez przeszkód, nie działa tylko wywołany z DLL'a. Z wywołaniem funkcji CoInitialize też kombinowałem i nic.

cytat:BloodCat napisał:

Jeżeli skopiuje kod do delphi to tam działa bez przeszkód, nie działa tylko wywołany z DLL'a. Z wywołaniem funkcji CoInitialize też kombinowałem i nic.

Czyli wniosek z tego taki ze masz zle napisanego dlla pod delphi. Sam kod pewnie jest dobry tylko trzeba cos dodac aby zostal wygenerowany z tego poprawnie dzialajacy dll. Mysle, ze chodzi o cos takiego jak dllMain w c++, ale nie jestem pewien czy na pewno o to chodzi.
Sprobuj poszukac na jakis grupach dyskusyjnych na googlach, albo poczekaj az ktos kto zna delphi Ci tu odpowie.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •