我正在尝试使用TIdHTTP组件从Delphi 2006中返回maps.google.com中的内容.
我的代码如下
procedure TForm1.GetGoogleMap();
var
t_GetRequest: String;
t_Source: TStringList;
t_Stream: TMemoryStream;
begin
t_Source := TStringList.Create;
try
t_Stream := TMemoryStream.Create;
try
t_GetRequest :=
'http://maps.google.com/maps/api/staticmap?' +
'center=Brooklyn+Bridge,New+York,NY' +
'&zoom=14' +
'&size=512x512' +
'&maptype=roadmap' +
'&markers=color:blue|label:S|40.702147,-74.015794' +
'&markers=color:green|label:G|40.711614,-74.012318' +
'&markers=color:red|color:red|label:C|40.718217,-73.998284' +
'&sensor=false';
IdHTTP1.Post(t_GetRequest, t_Source, t_Stream);
t_Stream.SaveToFile('google.html');
finally
t_Stream.Free;
end;
finally
t_Source.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
但是我一直得到HTTP/1.0 403 Forbidden的响应.我认为这意味着我没有权限提出此请求但是如果我将网址复制到我的网络浏览器IE 8中,它可以正常工作.是否有我需要的标题信息或其他内容?
我正在使用Delphi 2006,并且我正在开发的应用程序有点问题.
我有一个表单创建一个线程,调用一个执行冗长操作的函数,让我们称之为LengthyProcess.在LengthyProcess函数内部,我们还调用了几个Dll函数,这些函数也创建了自己的线程.
我遇到的问题是,如果我不使用我的线程的Synchronize函数调用LengthyProcess线程停止响应(主线程仍然响应正常).我不想使用Synchronize,因为这意味着主线程正在等待LengthyProcess完成,因此无法创建单独的线程.
我已经将问题跟踪到了创建线程然后调用WaitFor的dll中的函数,顺便说一下,这都是使用TThread完成的.WaitFor检查CurrentThreadID是否等于MainThreadID,如果是,那么它将调用CheckSychronization,一切正常.因此,如果我们使用Synchronize,那么CurrentThreadID将等于MainThreadID,但是如果我们不使用Synchronize当然是CurrentThreadID <> MainThreadID,并且当发生这种情况时WaitFor会告诉当前线程(我创建的线程)等待由此创建的线程DLL等所以CheckSynchronization永远不会被调用,我的线程最终会等待dll中创建的线程.
我希望这是有道理的,抱歉,我不知道有什么更好的解释方法.有没有其他人有这个问题,知道如何解决它吗?