Настройка UDL-соединения во время выполнения в Delphi - PullRequest
0 голосов
/ 01 октября 2019

В нашем приложении Delphi мы используем файл UDL для хранения свойств подключения. Если файл UDL отсутствует, я хочу создать его и позволить пользователю выбрать сервер / базу данных и установить имя пользователя / пароль. Затем его можно сохранить в файле UDL и использовать все время при запуске приложения. Я знаю, что здесь есть проблема с безопасностью, но именно так она работает в моем проекте (я не собираюсь ее сейчас менять).

Файл UDL должен находиться в C: \ Program Files (x86)Папка \ Common Files \ system \ ole db \ Data Links и, как правило, она там есть. Но если он отсутствует, я хочу создать его и позволить пользователю настроить сервер / базу данных и т. Д. В нем (это отличается для каждого клиента). Я уже знаю, как создать файл UDL (используя функцию CreateUDLFile). Но как вывести его на экран для пользователя, чтобы завершить настройку. Предполагается, что это своего рода настройка приложения, которая будет выполнена только один раз. Теперь это можно сделать вручную (двойным щелчком по файлу UDL), но я хочу автоматизировать его.

Это то, что я хочу, чтобы всплывающее окно:

enter image description here

1 Ответ

1 голос
/ 02 октября 2019

Это ответ на мой вопрос:

procedure TdmMain.DataModuleCreate(Sender: TObject);
var
  lDataLinkDir: String;
begin
  lDataLinkDir := DataLinkDir;
  if not FileExists(Format('%s\MBMIS.udl',[lDataLinkDir])) then
  begin
    if Copy(lDataLinkDir, Length(lDataLinkDir) - 1, 1) <> '\' then
      lDataLinkDir := lDataLinkDir + '\';
  // Creates empty UDL datalink.
  CreateUDLFile(lDataLinkDir + 'MBMIS.udl', 'SQLOLEDB.1', '');
  // Opens up the created UDL datalink for user to complete setup.
  ShellExecuteAndWait(lDataLinkDir + 'MBMIS.udl', '');
end;

{ Runs application using ShellExecuteEx and waits for completion. }
function TdmMain.ShellExecuteAndWait(FileName: String; Params: String): Boolean;
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    exInfo.lpVerb := 'open';
    exInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.hProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Result := true;
    exit;
  end;
  while WaitForSingleObject(exInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    Application.ProcessMessages;
  CloseHandle(Ph);
  Result := true;
end;
...