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