Delphi Outlook 2007/2010

#delphi #outlook #delphi-7

#delphi #outlook #delphi-7

Вопрос:

Я использую Delphi 7 с Outlook 2010 на 32-разрядной ОС Windows 7.

Моя проблема в том, что я не могу определить, запущен мой Outlook или нет. Я попробовал следующий код.

 uses
  ComObj, ActiveX;

function IsObjectActive(ClassName: string): Boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  try
    ClassID := ProgIDToClassID(ClassName);
    Result  := GetActiveObject(ClassID, nil, Unknown) = S_OK;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsObjectActive('Outlook.Application') then ShowMessage('Outlook is running !');
end; 
  

Используя приведенный выше код, delphi не обнаруживает, что Outlook запущен.

Можете ли вы сказать мне, есть ли какой-либо хороший альтернативный способ для того же. В моем приложении я использую Outlook Redemption, так есть ли что-нибудь в Redemption, чтобы я мог определить, что Outlook запущен?

Комментарии:

1. Я бы предположил, что вы используете либо Delphi (таким образом, вашу программу), либо Outlook с повышенными привилегиями? Я могу воспроизвести проблему при запуске Delphi от имени администратора, а не при обычном запуске.

2. На случай, если вы работаете не с разными учетными записями / уровнями прав доступа… В приведенном выше примере вы только что запустили Outlook? Outlook не регистрируется в таблице запущенных объектов (как запрашивается GetActiveObject) до тех пор, пока не произойдет переключение фокуса.

Ответ №1:

Вы можете проверить, является ли outlook.exe процесс запущен.

Ответ №2:

Я надеюсь, что это поможет.

 library IsCra;

uses
  SysUtils,
  Classes,
  Windows,
  TlHelp32;

{$R *.res}

function AppIsRunning(AApp: String): Boolean; stdcall;
var
  h: THandle;
  p: TProcessEntry32;
begin
  Result := False;

  p.dwSize := SizeOf(p);
  h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    Process32First(h, p);
    repeat
      Result := AnsiUpperCase(AApp) = AnsiUpperCase(p.szExeFile);
    until Result or (not Process32Next(h, p));
  finally
    CloseHandle(h);
  end;
end;

exports
  AppIsRunning;

begin
end.
  

Комментарии:

1. Я не думаю, что OP понадобится формат «dll project», который вы использовали здесь. Измените «library» на «unit», и удалите экспорт, и «begin» непосредственно перед концом, и добавьте ключевые слова интерфейса и реализации, и у вас будет действительный unit, который можно включить в ваш собственный код. Публикация автономной демо-версии библиотеки DLL с возможностью компиляции, вероятно, далека от идеала.

2. Я надеюсь, что большинство людей скопируют функцию и добавят ее в свой код. Я использую эту dll для начальной установки, чтобы узнать, запущено ли приложение перед новой установкой.