Innoでインターネットからファイルをダウンロードする方法。しかし、非同期ダウンロードが欲しいということに留意してください。言い換えれば、バックグラウンドでダウンロードが始まり、UIが応答可能であると思います。InnoスクリプトダウンロードファイルAsync
私が知る限り、innoスクリプトではasadsとtimerをサポートしていないので、asyncをダウンロードする方法はありません。
これを手伝ったり、これを達成する他の方法を教えてもらえますか?
Innoでインターネットからファイルをダウンロードする方法。しかし、非同期ダウンロードが欲しいということに留意してください。言い換えれば、バックグラウンドでダウンロードが始まり、UIが応答可能であると思います。InnoスクリプトダウンロードファイルAsync
私が知る限り、innoスクリプトではasadsとtimerをサポートしていないので、asyncをダウンロードする方法はありません。
これを手伝ったり、これを達成する他の方法を教えてもらえますか?
私はそれができるかどうかはわかりません。
ダウンロード用の新しいスレッド(ダウンロード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
関数はスレッドを作成して返します。他の関数は、スレッドが正常に終了したかどうかをチェックするために使用されます。
InnoTools Downloaderをご覧ください。これは正確にこの目的のために書かれており、ダウンロードの進行状況などをお知らせします。
InnoTools Downloaderは長い間更新されておらず、UNICODEをサポートしていないようです...
有望に見える別のプロジェクトがあります:https://bitbucket.org/mitrich_k/inno-download-plugin それはDec2016に更新され、InnoSetupのANSI & UNICODEバージョンをサポートしていましたが。 例があり、ドキュメントはOKであり、スペイン語、チニセ...
貴重な情報をお寄せいただきありがとうございます。上記のサポートのためのアルゴリズムまたはコードスニペット方法。私は拡張dllを書く方法を知っています、実際には、私はdllを作成して、それを前もってinno setupで使っていました。だから私はそれをする方法を知っている。上記のシナリオをより明確に示す、C++でのコードスニペットの共有や記述が可能です。これに関する助けがあれば大いに感謝します。 – Iqbal
こんにちは、私はそれほどC++の人ではないので、いくつかの擬似コードがOKであることを願っています。私は私の答えを編集します。 –
あなたはDeannaの答えに行くかもしれません... ;-) –