периодически возникающая проблема с автоматической загрузкой файлов

#file #delphi #upload

#файл #delphi #загрузка

Вопрос:

Я написал некоторый код на Delphi / Pascal для загрузки файла на веб-сайт. Чтобы выполнить это, я запускаю приведенный ниже код в потоке непосредственно перед нажатием кнопки загрузки. Поток ищет диалоговое окно загрузки файла Windows и заполняет его.

Большую часть времени это работает. Иногда, но с некоторой частотой, это не работает. Происходит то, что я ввожу полное имя файла с путем в диалоговое окно загрузки. По какой-то причине иногда Windows удаляет путь из имени файла. Поскольку указанное имя файла (без пути) не существует в каталоге, в котором в данный момент находится Windows, загрузка завершается неудачно.

Например, я загружаю «c:uploads10123.pdf «, Windows (иногда) усекает имя файла до «123.pdf», которое не существует ни в одном каталоге, указанном по умолчанию в диалоговом окне загрузки, поэтому загрузка завершается неудачно.

Какое-то время это сводило меня с ума. Может кто-нибудь сказать мне, как это исправить?

   for Looper := 1 to 2 do
  begin
    UploadDialogHandle := FindWindow('#32770', 'Choose File to Upload');
    if UploadDialogHandle = 0 then
      Sleep(100)
    else
    begin
      SetFileUploadDialogPosition(UploadDialogHandle);
      break;
    end;
  end;
  if UploadDialogHandle = 0 then
    exit;

  for Looper := 1 to 1 do
  begin
    // Find the child ComboBoxEx32 window
    UploadDialogFileEditHandle := FindWindowEx(FileUploadDialogHandle, 0,
      'ComboBoxEx32', '');
    if UploadDialogFileEditHandle = 0 then
      Sleep(100)
    else
      break;
  end;

  if UploadDialogFileEditHandle = 0 then
    exit;

  for Looper := 1 to 1 do
  begin
    // Find the child ComboBox window
    UploadDialogFileEditHandle := FindWindowEx(UploadDialogFileEditHandle, 0,
      'ComboBox', '');
    if UploadDialogFileEditHandle = 0 then
      Sleep(100)
    else
      break;
  end;
  for Looper := 1 to 1 do
  begin
    // Find the child Edit window
    UploadDialogFileEditHandle := FindWindowEx(UploadDialogFileEditHandle, 0,
      'Edit', '');
    if UploadDialogFileEditHandle = 0 then
      Sleep(100)
    else
      break;
  end;

  if UploadDialogFileEditHandle = 0 then
    exit;

  Result := False;
  if (UploadDialogHandle = 0) or (UploadDialogFileEditHandle = 0) or
    (FileUploadButtonHandle = 0) then
    exit;
  StrPCopy(aUploadFileName, FileNameString);
  SendMessage(UploadDialogFileEditHandle, WM_SETTEXT, SizeOf(aUploadFileName),
    Integer(@aUploadFileName));
  Sleep(200);
  SendMessage(UploadDialogFileEditHandle, WM_GETTEXT, SizeOf(FileEditContents),
    Integer(@FileEditContents));

  if (StrComp(aUploadFileName, FileEditContents) = 0) then
    SendMessage(FileUploadButtonHandle, BM_CLICK, 0, 0);
  

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

1.Ваши последние 2 вызова FindWindowEx() неверны и не нужны. Как только у вас есть ComboBoxEx ‘s HWND , вы можете отправить его CBEM_GETCOMBOCONTROL и CBEM_GETEDITCONTROL сообщения, чтобы получить его дочерние ComboBox элементы и Edit HWND s. С другой стороны, почему вы с самого начала управляете диалогом открытия файла таким образом? В зависимости от того, какая версия диалогового окна используется, вы можете вместо этого отправить диалоговому CDM_SETCONTROLTEXT окну сообщение. Но на самом деле, почему вы манипулируете другим приложением, чтобы загрузить файл для вас, вместо того, чтобы, знаете, на самом деле загружать файл самостоятельно?

2. Спасибо за ваш вклад. На самом деле я выполняю эту манипуляцию в своей собственной программе. В моей программе есть встроенный веб-браузер. Помимо загрузки файла, он содержит много другой информации, необходимой для загрузки. Все необходимые входные данные содержатся в базе данных, поэтому это экономит моим пользователям много времени.

3. » Я на самом деле выполняю эту манипуляцию в своей собственной программе » — тогда вы абсолютно неправильно подходите к этому. » В моей программе есть встроенный веб-браузер » — почему вы используете встроенный веб-браузер вместо компонента / библиотеки HTTP-клиента? Например, у Indy TIdHTTP или Embarcadero TRESTClient . Они бы сделали эту работу намного проще и понятнее. И тогда вы сможете использовать свой собственный TOpenDialog or TFileOpenDialog , если это необходимо.

4. Я никогда не играл с этими библиотеками компонентов. Способ работы моей программы заключается в том, что я захожу на веб-сайт, который контролируется третьей стороной. Моя программа автоматизирует большую часть взаимодействий с сайтом, но конечный пользователь всегда может при необходимости вводить данные вручную. Иногда третья сторона вносит изменения на свой веб-сайт, которые нарушают мой код, и мне приходится вносить изменения. В такой ситуации будут ли эти библиотеки компонентов работать лучше? Второй вопрос, я пытаюсь использовать ваши предыдущие предложения. Мой компилятор не распознает CBEM_GETEDITCONTROL. Какой модуль мне нужно добавить?