[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
|
メール
|
1-
101-
201-
301-
401-
501-
601-
701-
801-
901-
1001-
1101-
1201-
1301-
1401-
1501-
1601-
1701-
1801-
1901-
2001-
2101-
2201-
2301-
2401-
2501-
2601-
2701-
2801-
2901-
3001-
3101-
3201-
3301-
3401-
3501-
3601-
3701-
3801-
3901-
4001-
4101-
4201-
4301-
4401-
4501-
4601-
4701-
4801-
4901-
5001-
5101-
5201-
5301-
5401-
この機能を使うにはJavaScriptを有効にしてください
|
管理人の独り言(プログラミング関連)
1626
:
◆adhRKFl5jU
:2009/03/12(木) 12:50:11
#include "DownloadManager.hpp"
#include <iostream>
#include <string>
#include <cstdlib>
#include <cctype>
#include <windows.h>
#include <cstring>
int Run(const char*, DWORD);
int Init(const char*, DWORD);
std::string GetFileName(std::string);
void Death(const char*);
bool CreateMainProcess(std::string&);
int Run(const char *hash, DWORD pid){
DownloadManager dm(hash);
if(dm.AddPID(pid)){
if(dm.Initialize()){
int ret = dm.Loop();
dm.Finalize();
return ret;
}
}
return -1;
}
int Init(const char *_hash, DWORD pid){
std::string hash(_hash);
{
HANDLE hTesting = CreateMutexA(NULL, FALSE, ("DLTesting1:" + m_hash).c_str());
if(hTesting == NULL){
return -1;
}
HANDLE hRunning = CreateMutexA(NULL, FALSE, ("DLRuning:" + m_hash).c_str());
if(hRunning == NULL){
CloseHandle(hTesting);
return -1;
}
WaitForSingleObject(hTesting, INFINITE);
bool isMutexRunningNonSignal = WaitForSingleObject(hRunning, 0) == WAIT_OBJECT_0;
ReleaseMutex(hTesting);
if(isMutexRunningNonSignal){
ReleaseMutex(hRunning);
}
CloseHandle(hRunning);
CloseHandle(hTesting);
if(isMutexRunningNonSignal){
if(CreateMainProcess(hash)){
return 0;
}else{
return -1;
}
}
}
{
HANDLE hTesting = CreateMutexA(NULL, FALSE, ("DLTesting1:" + m_hash).c_str());
if(hTesting == NULL){
return -1;
}
HANDLE hFlag = CreateEvent(NULL, TRUE, FALSE, ("DLFlag:" + hash).c_str());
if(hFlag == NULL){
return -1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS){
}else{
if(CreateMainProcess(hash))
}
}
return 0;
}
bool
std::string GetFileName(std::string str){
typedef std::string::size_type size_type;
size_type pos = str.find_last_of('\\');
if(pos == std::string::npos){
pos = str.find_last_of('/');
}
if(pos == std::string::npos || pos == str.length() - 1){
return str;
}
return str.substr(pos + 1);
}
int main(int argc, char **argv){
if(argc < 2){
Death("引数が凄く足りません。");
}
const char *hash = NULL;
DWORD pid = ~0;
bool run = false;
for(int i = 1; i < argc; ++i){
if(argv[i][0] == '/' || argv[i][0] == '-'){
switch(argv[i][1]){
case 'h':
case 'H':{
hash = &argv[i][2];
break;
}
case 'i':
case 'I':{
pid = (DWORD)std::atol(&argv[i][2]);
break;
}
case 'r':
case 'R':{
run = true;
break;
}
}
}
}
//コマンドラインが無くても、ここで引っかかるはず。
if(pid == ~0 || hash == NULL){
Death("引数が足りないです。");
}
//パイプの最大の長さは全体で256文字まで。バックスラッシュ以外は利用可能。
//このソフトは英数字以外は利用しないとする。
//256 - nはn文字分確保するため。
{
unsigned int len = 0;
while(hash[len]){
++len;
if(len <= 256 - 15){
if(std::isalpha(hash[len - 1]) || std::isdigit(hash[len - 1])){
}else{
Death("渡されたハッシュに不正な文字が含まれています。");
}
}else{
Death("渡されたハッシュが長すぎます。");
}
}
if(len == 0){
Death("渡されたハッシュがありません。");
}
}
if(run){
return Run(hash, pid);
}
return Init(hash, pid);
}
//エラー吐いて死ぬ
void Death(const char *str){
std::cerr << GetFileName(__argv[0]) << ":" << str << std::endl;
std::exit(-1);
}
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板