Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2013, 21:22   #1
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
Вопрос Критические ошибки

Здравствуйте!
Я пишу DLL по работе с почтой. У меня возникла проблема. К примеру при попытке программы прочитать входящие сообщения при вырубленном интернете вылезает критическая ошибка и программа закрывается, а мне желательно чтоб вылетело сообщение о неполадках с нетом и приложение прордолжило работу.
Подскажите пожайлуста, как это сделать.
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 09.01.2013, 21:26   #2
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

с помощью rasapi проверяйте на наличие соединения с интернетом или другими способами
Вложения
Тип файла: rar RasAPI.rar (16.6 Кб, 8 просмотров)
beegl вне форума Ответить с цитированием
Старый 09.01.2013, 21:44   #3
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Спасибо, конечно!
А можно как то на 100% подстраховаться??? Просто дело не только в нете. Допустим пользователь введёт не верный пароль или логин. От всего не перестрахуешся.
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 09.01.2013, 21:53   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

http://www.delphisources.ru/pages/fa...xcept.php.html
Если пароль не правильный, то анализировать ответ от сервера
eoln вне форума Ответить с цитированием
Старый 09.01.2013, 22:15   #5
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

eoln, спасибо!
То что нужно.
+1
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 10.01.2013, 20:25   #6
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

У меня возникла новая проблема. При попытке прочитать сообщение без интернета появляется Invalid pointer operation. Уже искал решения данной проблемы насчёт ShareMem и использования короткого стринга. Но при первом никакой ошибки при вырубленном инете не происходит, а когда пытаюсь закрыть прогу, вылетает куча разных ошибок, а второе не подходит потому что мне надо читать большие сообщения.

И ещё ошибка происходит сразу, когда вводишь не правильный майл или пароль, тогда прога зависает на 10 сек. а затем вылетает ошибка.

Смотрите проект.
Вложения
Тип файла: rar DLL.rar (569.5 Кб, 9 просмотров)
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 11.01.2013, 07:32   #7
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

И вообще написано криво
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 11.01.2013 в 08:23.
Slym вне форума Ответить с цитированием
Старый 11.01.2013, 11:03   #8
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Можно например так:
Код:
library Project1;

uses
  SysUtils,  Classes,  IdSMTP,  IdPOP3,  IdMessage,  IdText;

{$R *.res}

type
  PMailBox=^TMailBox;
  TMailBox=record
    Pop3:TidPOP3;
    Smtp:TidSMTP;
    Data:string;
  end;

function MailBoxCreate:PMailBox;
begin
  new(result);
end;

procedure MailBoxFree(MailBox:PMailBox);
begin
  FreeAndNil(MailBox.Pop3);
  FreeAndNil(MailBox.Smtp);
  dispose(MailBox);
end;

function MailBoxGetData(MailBox:PMailBox;Buf:PChar;BufLength:integer):integer;
begin
  if BufLength=0 then
  begin
    result:=Length(MailBox.Data);
    exit;
  end;
  if BufLength>=Length(MailBox.Data) then
  begin
    StrPCopy(Buf,MailBox.Data);
    result:=Length(MailBox.Data);
  end else
    result:=-1;
end;

function SetPop3Params(MailBox:PMailBox;Host,Username,Password:PChar):boolean;
begin
  if not assigned(MailBox.Pop3) then
    MailBox.Pop3:=TidPOP3.Create(nil);
  MailBox.Pop3.Host:=StrPas(Host);
  MailBox.Pop3.Username:=StrPas(Username);
  MailBox.Pop3.Password:=StrPas(Password);
  result:=true;
end;

function SetSmtpParams(MailBox:PMailBox;Host,Username,Password:PChar):boolean;
begin
  if not assigned(MailBox.Smtp) then
    MailBox.Smtp:=TidSMTP.Create(nil);
  MailBox.Smtp.Host:=StrPas(Host);
  MailBox.Smtp.Username:=StrPas(Username);
  MailBox.Smtp.Password:=StrPas(Password);
  result:=true;
end;

procedure CheckPop3(MailBox:PMailBox);
begin
  if not assigned(MailBox.Pop3) then
  begin
    MailBox.Data:='Не установлены настройки хоста';
    Abort;
  end;
  if not MailBox.Pop3.Connected then
    MailBox.Pop3.Connect;
end;

function MailBoxReadMessageCount(MailBox:PMailBox):integer;
begin
  try
    CheckPop3(MailBox);
    result:=MailBox.POP3.CheckMessages;
  except
    result:=-1;
  end;
end;

function MailBoxReadMessage(MailBox:PMailBox;ID:integer):boolean;
var
  Msg:TidMessage;
  i:integer;
begin
  try
    CheckPop3(MailBox);
    Msg:=TidMessage.Create(nil);
    try
      MailBox.POP3.Retrieve(ID,Msg);
      MailBox.Data:=Msg.Body.Text;
      for i:=0 to Msg.MessageParts.Count-1 do
        if Msg.MessageParts.Items[i] is TIdText then
          MailBox.Data:=MailBox.Data+(Msg.MessageParts.Items[i] as TIdText).Body.Text;
    finally
      Msg.Free;
    end;
    result:=true;
  except
    result:=false;
  end;
end;


Exports MailBoxCreate, MailBoxFree, MailBoxGetData, SetPop3Params, SetSmtpParams, MailBoxReadMessage;

begin
end.
использование
Код:
unit wraper;

interface

type
  PMailBox=Pointer;

function MailBoxCreate:PMailBox;
procedure MailBoxFree(MailBox:PMailBox);
function MailBoxGetData(MailBox:PMailBox;Buf:PChar;BufLength:integer):integer;
function SetPop3Params(MailBox:PMailBox;Host,Username,Password:PChar):boolean;
function SetSmtpParams(MailBox:PMailBox;Host,Username,Password:PChar):boolean;
function MailBoxReadMessageCount(MailBox:PMailBox):integer;
function MailBoxReadMessage(MailBox:PMailBox;ID:integer):boolean;

implementation
const
  DllName = 'Project1.dll';

function MailBoxCreate:PMailBox;external DllName;
procedure MailBoxFree(MailBox:PMailBox);external DllName;
function MailBoxGetData(MailBox:PMailBox;Buf:PChar;BufLength:integer):integer;external DllName;
function SetPop3Params(MailBox:PMailBox;Host,Username,Password:PChar):boolean;external DllName;
function SetSmtpParams(MailBox:PMailBox;Host,Username,Password:PChar):boolean;external DllName;
function MailBoxReadMessageCount(MailBox:PMailBox):integer;external DllName;
function MailBoxReadMessage(MailBox:PMailBox;ID:integer):boolean;external DllName;

end.

procedure TForm1.Button1Click(Sender: TObject);
var
  MailBox:PMailBox;
  Msg:string;
begin
  MailBox:=MailBoxCreate;
  SetPop3Params(MailBox,'pop.mail.ru','$$$$','$$$$');
  MailBoxReadMessage(MailBox,1);

  SetLength(Msg,MailBoxGetData(MailBox,nil,0));
  SetLength(Msg,MailBoxGetData(MailBox,PChar(Msg),Length(Msg)));
  Label1.Caption:=Msg;
  MailBoxFree(MailBox);
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 11.01.2013, 18:02   #9
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Почему написано криво???
И как научится ровно писать???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 11.01.2013, 20:13   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Почитайте Gunsmoker'a ( и большую часть ссылок что у него на других товарищей), при должном старании научитесь ровно писать, и станете видеть , почему криво. Ну там по стилю, конечно , в основном, а так надо ещё и теоретическую базу подтягивать.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Критические секции tcriticalsection Dеlphi Общие вопросы Delphi 5 11.10.2011 19:45
Критические секции coNsept Общие вопросы C/C++ 7 09.09.2011 00:54
критические точки alex_pm Помощь студентам 1 05.05.2011 00:52
Критические секции в Linux Sparky Помощь студентам 2 28.05.2010 08:33
Критические секции Altera Общие вопросы Delphi 2 25.12.2009 10:45