代理更改例程在delphi 10.2上不起作用
我正在使用Raises例程在系统内配置use proxy。 它在版本7的delphi中工作得非常好。在Delphi10.2(Tokyo)中,即使编译没有错误,调用例程时也会通知代理没有响应(即代理正常并且在Delphi7调用中工作) 有人知道会发生什么吗代理更改例程在delphi 10.2上不起作用,delphi,delphi-7,Delphi,Delphi 7,我正在使用Raises例程在系统内配置use proxy。 它在版本7的delphi中工作得非常好。在Delphi10.2(Tokyo)中,即使编译没有错误,调用例程时也会通知代理没有响应(即代理正常并且在Delphi7调用中工作) 有人知道会发生什么吗 function ApplyProxy(proxy: string):Boolean; var MyInternetProxyInfo: PInternetProxyInfo; begin try Result:=False; p
function ApplyProxy(proxy: string):Boolean;
var
MyInternetProxyInfo: PInternetProxyInfo;
begin
try
Result:=False;
proxy:=Trim(proxy);
MyInternetProxyInfo:=New(PInternetProxyInfo);
try
if proxy = EmptyStr then
MyInternetProxyInfo^.dwAccessType := INTERNET_OPEN_TYPE_DIRECT else
begin
MyInternetProxyInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY;
MyInternetProxyInfo^.lpszProxy := PAnsiChar(Trim(proxy));
MyInternetProxyInfo^.lpszProxyBypass := PAnsiChar('<local>');
end;
Result:=InternetSetOption(nil, INTERNET_OPTION_PROXY, MyInternetProxyInfo,
SizeOf(MyInternetProxyInfo^));
finally
Dispose(MyInternetProxyInfo);
end;
except
Result:=False;
end;
end;
函数ApplyProxy(代理:字符串):布尔值;
变量
MyInternetProxyInfo:PInternetProxyInfo;
开始
尝试
结果:=假;
代理:=修剪(代理);
MyInternetProxyInfo:=新建(PInternetProxyInfo);
尝试
如果proxy=EmptyStr,则
MyInternetProxyInfo^.dwAccessType:=INTERNET\u OPEN\u TYPE\u DIRECT else
开始
MyInternetProxyInfo^.dwAccessType:=互联网\开放\类型\代理;
MyInternetProxyInfo^.lpszProxy:=PAnsiChar(Trim(proxy));
MyInternetProxyInfo^.lpszProxyBypass:=泛七边形(“”);
结束;
结果:=InternetSetOption(无,INTERNET选项代理,MyInternetProxyInfo,
SizeOf(MyInternetProxyInfo^);
最后
处置(MyInternetProxyInfo);
结束;
除了
结果:=假;
结束;
结束;
在Delphi 10.2中,字符串是unicode,编译器将警告
PAnsiChar(Trim(proxy));
是
W1044字符串到PAnsiChar的可疑类型转换
这在执行时将不起作用。首先将字符串转换为AnsiString
例如:
MyInternetProxyInfo^.lpszProxy := PAnsiChar(AnsiString(Trim(proxy)));
根据建议,我改变了程序,开始在东京10.2更新3上运行
function ApplyProxy(proxy: string):Boolean;
var
MyInternetProxyInfo: PInternetProxyInfo;
begin
try
Result:=False;
proxy:=Trim(proxy);
MyInternetProxyInfo:=New(PInternetProxyInfo);
try
if proxy = EmptyStr then
MyInternetProxyInfo^.dwAccessType := INTERNET_OPEN_TYPE_DIRECT else
begin
MyInternetProxyInfo^.dwAccessType := INTERNET_OPEN_TYPE_PROXY;
MyInternetProxyInfo^.lpszProxy := PAnsiChar(AnsiString(Trim(proxy)));
MyInternetProxyInfo^.lpszProxyBypass := PAnsiChar('<local>');
end;
Result:=InternetSetOption(nil, INTERNET_OPTION_PROXY, MyInternetProxyInfo, SizeOf(MyInternetProxyInfo^));
finally
Dispose(MyInternetProxyInfo);
end;
except
Result:=False;
end;
end;
函数ApplyProxy(代理:字符串):布尔值;
变量
MyInternetProxyInfo:PInternetProxyInfo;
开始
尝试
结果:=假;
代理:=修剪(代理);
MyInternetProxyInfo:=新建(PInternetProxyInfo);
尝试
如果proxy=EmptyStr,则
MyInternetProxyInfo^.dwAccessType:=INTERNET\u OPEN\u TYPE\u DIRECT else
开始
MyInternetProxyInfo^.dwAccessType:=互联网\开放\类型\代理;
MyInternetProxyInfo^.lpszProxy:=PAnsiChar(AnsiString(Trim(proxy));
MyInternetProxyInfo^.lpszProxyBypass:=泛七边形(“”);
结束;
结果:=InternetSetOption(无,INTERNET_选项_代理,MyInternetProxyInfo,SizeOf(MyInternetProxyInfo^));
最后
处置(MyInternetProxyInfo);
结束;
除了
结果:=假;
结束;
结束;
在Delphi 10.2中,东京字符串是unicode,编译器将提示PAnsiChar(Trim(proxy))代码>是W1044可疑的字符串类型转换到PAnsiChar,执行时将不起作用。首先将字符串转换为ansistring。我非常感激。非常感谢你。我就这样离开了它,它工作了,我非常需要它:MyInternetProxyInfo^.lpszProxy:=PAnsiChar(AnsiString(Trim(proxy));为什么使用ANSI版本的API而不是UNICODE版本InternetSetOption()
应该映射到D2009+下的InternetSetOptionW()
而不是InternetSetOptionA()
。您应该使用internetoption\u PER\u CONNECTION\u OPTION
来设置代理,而不是像MSDN文档所说的那样使用internetoption\u proxy
。请注意,如果代理地址包含Unicode字符(无法从代理地址中找到IP地址),则此操作将失败。最好使用xxxW()API调用而不是xxxA(),因为xxxA()不需要类型转换,也不会在地址中的Unicode字符上失败。