首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Inno设置URLDownloadToCacheFile

Inno设置URLDownloadToCacheFile
EN

Stack Overflow用户
提问于 2015-06-07 10:44:14
回答 1查看 354关注 0票数 1

每当我试图编译这段代码时,都会出现一个错误消息msg ->类型不匹配。为什么?

第一个变量是用相同的“零”调用的,编译器对它没有问题,但对最后一个变量呢?

代码语言:javascript
运行
复制
[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;

以这种方式修改代码:

代码语言:javascript
运行
复制
[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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-07 12:33:54

最初的问题是将nil传递给Variant类型的参数。Variant类型的空值是Pascal脚本中的NULL

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

代码语言:javascript
运行
复制
STDAPI URLDownloadToCacheFileW(
    _In_opt_ LPUNKNOWN,
    _In_ LPCWSTR, // <- this is wrong on MSDN; this type would have to be LPCSTR here
    _Out_writes_(cchFileName) LPWSTR,
    DWORD cchFileName,
    DWORD,
    _In_opt_ LPBINDSTATUSCALLBACK
);

因此,您的脚本可能是这样编写的(它还应该支持ANSI版本的Inno安装程序,但我还没有在那里测试它):

代码语言:javascript
运行
复制
[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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30692594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档