Inno setup Inno安装程序URLDownloadToCacheFile

Inno setup Inno安装程序URLDownloadToCacheFile,inno-setup,Inno Setup,每当我试图编译这段代码时,就会出现一个错误msg->Type mismatch。为什么? 使用相同的“nil”调用第一个变量,编译器对此没有问题,但最后一个变量有问题吗 [Setup] AppName=MyApp AppVerName=MyApp DefaultDirName={pf}\MyApp DefaultGroupName=MyApp OutputDir=. [Code] function URLDownloadToCacheFile(const lpUnkcaller: varian

每当我试图编译这段代码时,就会出现一个错误msg->Type mismatch。为什么?

使用相同的“nil”调用第一个变量,编译器对此没有问题,但最后一个变量有问题吗

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
DefaultGroupName=MyApp
OutputDir=.

[Code]
function URLDownloadToCacheFile(const lpUnkcaller: variant; const szURL: PAnsiChar; var szFileName: PAnsiChar; const cchFileName: DWORD; const dwReserved: DWORD; IBindStatusCallback: variant): HRESULT; external 'URLDownloadToFileW@Urlmon.dll stdcall';

function InitializeSetup(): Boolean;
var
  szFileName, szURL : PAnsiChar;
  ErrorCode : HRESULT;
  MAX_PATH : DWORD;
begin
  szURL := 'http://fs2.directupload.net/images/user/150607/x3sugvzy.jpg';
  MAX_PATH := 512;
  SetLength(szFileName, MAX_PATH + 1);
  ErrorCode := URLDownloadToCacheFile(null, szURL, szFileName, MAX_PATH, 0, null);
end;
以这种方式更改代码:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
DefaultGroupName=MyApp
OutputDir=.

[Code]
function URLDownloadToCacheFile(const lpUnkcaller: variant; const szURL: AnsiString; var szFileName: String; const cchFileName: DWORD; const dwReserved: DWORD; IBindStatusCallback: variant): HRESULT; external 'URLDownloadToFileW@Urlmon.dll stdcall';

function InitializeSetup(): Boolean;
var
    szFileName : String;
    szURL : AnsiString;
    ErrorCode : HRESULT;
    MAX_PATH : DWORD;
begin
    szURL := 'http://fs2.directupload.net/images/user/150607/x3sugvzy.jpg';
    MAX_PATH := 512;
    SetLength(szFileName, 513);
    ErrorCode := URLDownloadToCacheFile(null, szURL, szFileName, MAX_PATH, 0, null);
    MsgBox(szFileName,mbConfirmation, MB_OK);
end;

最初的问题是将
nil
传递给类型为
Variant
的参数。在Pascal脚本中,
变量
类型的Null值为
Null

但是,您的原型需要更改。在使用函数的Unicode变体时,需要使用Unicode数据类型,因此不能在那里使用
PAnsiChar
类型。下一个问题是用于接口类型参数的
变量
类型。那不行。您可以在那里使用
IUnknown
类型,因为
lpUnkcaller
参数是指向此类型的指针,而
pBSC
是从
IUnknown
继承的
IBindStatusCallback
类型。最后一个问题是MSDN在这里是错误的。
szURL
是根据
LPCTSTR
类型的头文件,而不是
LPCSTR
。Unicode变体原型在SDK 8.1 urlmon.h头文件(由我格式化并注释)中如下所示:

STDAPI url下载到achefilew(
_在_opt LPUNKNOWN中,

_在uucwstr中,//code>Variant
类型的Null值为
Null
,而不是
nil
。另外,
szFileName
类型为
LPTSTR
,您正在使用Unicode Inno设置(因为
PAnsiChar
类型).thx用于此超级快速答案。将修改此选项。我更改了nil->null..编译器现在可以工作。对于
LPCSTR
参数,您可以在Unicode Inno设置中使用
AnsiString
,或者在ANSI Inno设置中使用
string
。对于
LPTSTR
它可以是Unicode IS中的
string
,或者ANSI IS中的
WideString
,如果您是在Unicode函数变体的上下文中使用它(这是您的情况)。注意:请不要使用回答帖子来提问新问题。如果您有新问题,请单独提问(或者,如果是当前问题的更新,请编辑)。谢谢您的修复、解决方案和详细回复。我发现了此().我的意图是作为后台进程下载(带有跟踪回调),但无法使其工作。
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Code]
const
  MAX_PATH = 260;
  S_OK = $00000000;

#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif

function URLDownloadToCacheFile(lpUnkcaller: IUnknown; szURL: string; szFileName: string;
  cchFileName: DWORD; dwReserved: DWORD; pBSC: IUnknown): HRESULT;
  external 'URLDownloadToCacheFile{#AW}@urlmon.dll stdcall';

function TryDownloadToCache(const URL: string; out FileName: string): Boolean;
begin
  SetLength(FileName, MAX_PATH);
  Result := URLDownloadToCacheFile(nil, URL, FileName, Length(FileName), 0, nil) = S_OK;
end;

function InitializeSetup: Boolean;
var
  FileName: string;
  ErrorCode: Integer;
begin
  Result := True;

  if TryDownloadToCache('http://i.imgur.com/wKCsei6.png', FileName) then
    ShellExec('', FileName, '', '', SW_SHOW, ewNoWait, ErrorCode)
  else
    MsgBox('Downloading failed.', mbError, MB_OK);
end;