File 自动上传文件时出现间歇性问题

File 自动上传文件时出现间歇性问题,file,delphi,upload,File,Delphi,Upload,我已经用Delphi/Pascal编写了一些代码来将文件上传到网站。为了完成它,我在点击上传按钮之前,在一个线程中运行下面的代码。线程查找windows上载文件对话框并将其填充 它大部分时间都有效。偶尔但有一些频率,它不起作用。发生的事情是,我正在上传对话框中输入完整的文件名和路径。由于某些原因,windows有时会从文件名中删除路径。由于windows当前所在的目录中不存在给定的文件名(无路径),因此上载失败 例如,我正在上载“c:\uploads10\123.pdf”,Windows(有时)

我已经用Delphi/Pascal编写了一些代码来将文件上传到网站。为了完成它,我在点击上传按钮之前,在一个线程中运行下面的代码。线程查找windows上载文件对话框并将其填充

它大部分时间都有效。偶尔但有一些频率,它不起作用。发生的事情是,我正在上传对话框中输入完整的文件名和路径。由于某些原因,windows有时会从文件名中删除路径。由于windows当前所在的目录中不存在给定的文件名(无路径),因此上载失败

例如,我正在上载“c:\uploads10\123.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);

您对
FindWindowEx()
的最后两次调用是错误的,并且是不必要的。一旦您有了一个
ComboBox
HWND
,您就可以向它发送
CBEM\u GETCOMBOCONTROL
CBEM\u GETEDITCONTROL
消息来获取它的子
ComboBox
编辑
HWND
s。另一方面,为什么要以这种方式操作文件打开对话框?根据正在使用的对话框版本,您可能可以改为向对话框发送
CDM_SETCONTROLTEXT
消息。但说真的,你为什么操纵另一个应用程序来为你上传文件,而不是自己上传文件呢?谢谢你的输入。实际上,我在自己的程序中进行这种操作。我的程序有一个嵌入式网络浏览器。除了上传文件,它还需要上传很多其他信息。所有必需的输入都包含在一个数据库中,因此这为我的用户节省了大量时间。“我实际上是在我自己的程序中进行这种操作的”——那么你的做法绝对是错误的。“我的程序有一个嵌入式webbrowser”-为什么要使用嵌入式webbrowser而不是HTTP客户端组件/库?例如Indy的
TIdHTTP
,或Embarcadero的
TRESTClient
。他们将使这项工作更容易、更直接。然后,如果需要,您可以使用自己的
TOpenDialog
TFileOpenDialog
。我从来没有玩过这些组件库。我的程序的工作方式是,我登录到由第三方控制的网站。我的程序自动化了网站的大部分交互,但最终用户总是可以在必要时手动输入。有时,第三方对他们的网站进行更改,这将破坏我的代码,我必须进行更改。在这种情况下,这些组件库是否工作得更好?第二个问题,我想用你先前的建议。我的编译器无法识别CBEM_GETEDITCONTROL。我需要添加什么单位?您对
FindWindowEx()
的最后两次调用是错误的,没有必要的。一旦您有了一个
ComboBox
HWND
,您就可以向它发送
CBEM\u GETCOMBOCONTROL
CBEM\u GETEDITCONTROL
消息来获取它的子
ComboBox
编辑
HWND
s。另一方面,为什么要以这种方式操作文件打开对话框?根据正在使用的对话框版本,您可能可以改为向对话框发送
CDM_SETCONTROLTEXT
消息。但说真的,你为什么操纵另一个应用程序来为你上传文件,而不是自己上传文件呢?谢谢你的输入。实际上,我在自己的程序中进行这种操作。我的程序有一个嵌入式网络浏览器。除了上传文件,它还需要上传很多其他信息。所有必需的输入都包含在一个数据库中,因此这为我的用户节省了大量时间。“我实际上是在我自己的程序中进行这种操作的”——那么你的做法绝对是错误的。“我的程序有一个嵌入式webbrowser”-为什么要使用嵌入式webbrowser而不是HTTP客户端组件/库?例如Indy的
TIdHTTP
,或Embarcadero的
TRESTClient
。他们将使这项工作更容易、更直接。然后,如果需要,您可以使用自己的
TOpenDialog
TFileOpenDialog
。我从来没有玩过这些组件库。我的程序的工作方式是,我登录到由第三方控制的网站。我的程序自动化了网站的大部分交互,但最终用户总是可以在必要时手动输入。有时,第三方对他们的网站进行更改,这将破坏我的代码,我必须进行更改。在这种情况下,这些组件库是否工作得更好?第二个问题,我想用你先前的建议。我的编译器无法识别CBEM_GETEDITCONTROL。我需要加什么单位?