2011-07-27 6 views
1

Innoでインターネットからファイルをダウンロードする方法。しかし、非同期ダウンロードが欲しいということに留意してください。言い換えれば、バックグラウンドでダウンロードが始まり、UIが応答可能であると思います。InnoスクリプトダウンロードファイルAsync

私が知る限り、innoスクリプトではasadsとtimerをサポートしていないので、asyncをダウンロードする方法はありません。

これを手伝ったり、これを達成する他の方法を教えてもらえますか?

答えて

1

私はそれができるかどうかはわかりません。

ダウンロード用の新しいスレッド(ダウンロードURLと一時ファイル名を渡す)と、ダウンロードを確認するために定期的に呼び出すことができる1つのファイルが2つあります。エラーが発生しました。

セットアップが開始されると、最初の機能が呼び出されます(アンインストール時にはダウンロードを開始しないようにしてください)。ダウンロードしたファイルが必要なときは、2番目のメソッドを呼び出します。ある時点で、ダウンロードが完了するまで待つ必要があります。

また、考えてみると、ダウンロードスレッドをキャンセルする別の機能が役立ちますので、キャンセルする設定に反応することができます。

パスカルスクリプトからDLLの関数を呼び出す方法のヒントについては、this questionを参照してください。私は関数が行うことを期待するものがより明確にするため

EDIT
、私は(ビットC#の;-)のように見えるかもしれません)いくつかの擬似コードを作るしようとしている:

// This is a global variable for the thread 
Thread globalDownloadThread = null; 
bool threadFinished = false; 
bool threadShouldFinish = false; 

void StartDownload(string url, string outputFile) 
{ 
    globalDownloadThread = new Thread(DownloadThreadMethod); 
    globalDownloadThread.Start(url, outputFile); 
} 

void DownloadThreadMethod(string url, string outputFile) 
{ 
    bool downloadComplete = false; 
    bool downloadErrors = false; 

    while (!threadShouldFinish && !downloadComplete && !downloadErrors) 
    { 
     // Download a bit of the file 
     // Save to the output file 

     // Store errors 
     if (error) 
      downloadErrors = true; 
     else if (noMoreBytesToDownload) 
      // When we're done... 
      downloadComplete = true; 
    } 

    threadFinished = true; 
} 

void CancelThread() 
{ 
    threadShouldFinish = true; 
    globalDownloadThread.Join(); // Wait for thread to finish! 
} 

bool IsThreadDone() 
{ 
    return threadFinished; 
} 

Innoセットアップでは、まずStartDownloadメソッドを呼び出します。 StartDownloadが呼び出された後でセットアップがキャンセルされた場合(スレッドがある場合のみ)、CancelThreadに電話してください。

ファイルがダウンロードされたことを確認する必要がある時点で、trueを返すまで、IsThreadDoneを繰り返し呼び出します。

もちろん、これにはロック機構が必要ですが、実際のエラー報告はありませんが、私が念頭に置いたことを思い浮かべてください。


私はあなたがコメントで投稿したものとはC++に私の擬似コードの一部を翻訳しますEDIT 2。

HANDLE hThread = 0; 
DWORD dwThreadId = 0; 
DWORD dwThreadResult = 0; 

extern "C" bool _declspec(dllexport) downloadfile(TCHAR *url, TCHAR *dest) 
{ 
    DOWNLOADPARAM *obj = new DOWNLOADPARAM(); 
    obj->szURL = url; 
    obj->szFilePath = dest; 

    if ((hThread = CreateThread(NULL, 0, inetTransfer, (LPVOID)obj, 0,&dwThreadId)) == NULL) 
    { 
     return FALSE; 
    } 

    return TRUE; 
} 

extern "C" bool _declspec(dllexport) isThreadDone() 
{ 
    DWORD res = WaitForSingleObject(hThread, 10); 
    if (res == WAIT_OBJECT_0) 
     return TRUE; 

    // Set error flag depending on other values of res 
    dwThreadResult = res; 
    return FALSE; 
} 

extern "C" DWORD _declspec(dllexport) isThreadErrored() 
{ 
    return dwThreadResult; 
} 

whileループあなたのinetTransfer関数内かどうかがあるのか​​どうかは関係ありません - あなたはおそらくも、いくつかの種類のループが必要になります! downloadfile関数はスレッドを作成して返します。他の関数は、スレッドが正常に終了したかどうかをチェックするために使用されます。

+0

貴重な情報をお寄せいただきありがとうございます。上記のサポートのためのアルゴリズムまたはコードスニペット方法。私は拡張dllを書く方法を知っています、実際には、私はdllを作成して、それを前もってinno setupで使っていました。だから私はそれをする方法を知っている。上記のシナリオをより明確に示す、C++でのコードスニペットの共有や記述が可能です。これに関する助けがあれば大いに感謝します。 – Iqbal

+0

こんにちは、私はそれほどC++の人ではないので、いくつかの擬似コードがOKであることを願っています。私は私の答えを編集します。 –

+0

あなたはDeannaの答えに行くかもしれません... ;-) –

2

InnoTools Downloaderをご覧ください。これは正確にこの目的のために書かれており、ダウンロードの進行状況などをお知らせします。

+0

このダウンローダはコールをブロックし、私はインターネットダウンロードのための非ブロッキング機能が必要です。 – Iqbal

+1

何故ですか?インストーラはUIの応答性を維持するために多くのことを行うことができません。 – Deanna

1

InnoTools Downloaderは長い間更新されておらず、UNICODEをサポートしていないようです...

有望に見える別のプロジェクトがあります:https://bitbucket.org/mitrich_k/inno-download-plugin それはDec2016に更新され、InnoSetupのANSI & UNICODEバージョンをサポートしていましたが。 例があり、ドキュメントはOKであり、スペイン語、チニセ...