#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 для начальной установки, чтобы узнать, запущено ли приложение перед новой установкой.