全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1156
推到 Plurk!
推到 Facebook!

請問一下ShellexecuteEx的問題

尚未結案
willchen
初階會員


發表:64
回覆:81
積分:29
註冊:2003-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-28 15:32:01 IP:163.28.xxx.xxx 未訂閱
各位高手好,小弟有遇到一個問題,但我現在找不到好方法解決 問題大致上如下 我把程式寫在A程式的Listbox的OnDblClick的事件下,先開啟test.txt檔, 並存入一些資料到test.txt,之後在這個事件下我又用ShellExecuteEx 呼叫B執行同時B也讀取test.txt,並處理一些事情之後,再把資料存入test.txt 之後再呼叫B之後,再對test.txt作一些包裝,才結束這個OnDblClick    但小弟我發現,會發生A與B會同時搶test.txt的狀況(B在呼叫ShellExecuteEx時 有使用呼叫等待(即等待B結束才會回到A),請問這是什麼問題?? 我把OnDblClick的事件貼出來給大家參考一下     
 
 if(!FileExists(CurrentDir "agent.tmp"))  //agent.tmp檔案不在則建立
  {
   int iFileHandle=FileCreate(CurrentDir "agent.tmp");
   FileClose(iFileHandle);
  }     TMemoryStream *tempstream=new TMemoryStream();
 int left,right; //左右index;
 AnsiString Itemtext=ServerletList->Items->Strings[ServerletList->ItemIndex];     //服務主機的IP
 left=Itemtext.Pos("[") 1;
 right=Itemtext.Pos("]");
 AnsiString ServerletIP=Itemtext.SubString(left,right-left);
 //End     //服務程式名稱
 left=Itemtext.Pos("<") 1;
 right=Itemtext.Pos(">");
 AnsiString ServerletName=Itemtext.SubString(left,right-left);
 //End     //Agentlet名稱
 right=ServerletName.Pos(".")-1;
 AnsiString Agentletname=ServerletName.SubString(1,right) "_Agentlet.exe";
 //End     //呼叫ShellExecute前置作業
 DWORD ExitCode;
 SHELLEXECUTEINFO ExecInfo;
 ZeroMemory(&ExecInfo,sizeof(ExecInfo));     ExecInfo.cbSize=sizeof(ExecInfo);
 ExecInfo.fMask=SEE_MASK_NOCLOSEPROCESS;
 ExecInfo.lpVerb="Open";
 ExecInfo.lpFile=(Agentletname).c_str();
 ExecInfo.lpParameters=NULL;
 ExecInfo.lpDirectory=(Agentletpath).c_str();
 ExecInfo.hwnd=Application->Handle;
 ExecInfo.nShow=SW_SHOWNORMAL;
 //End      //開agent.tmp檔存入ItemXXX Title 加入Title XXXXXXXXXXXX
  AnsiString ScriptTitle="" "" AntiIPConverter(ServerletIP) "";      tempstream->LoadFromFile(CurrentDir "agent.tmp");         //先讀取agent.tmp檔      if((int)tempstream->Size==0)                              //表示agent.tmp為新檔
   {
    tempstream->Size=ScriptTitle.Length();
    memcpy(tempstream->Memory,ScriptTitle.c_str(),ScriptTitle.Length());
    tempstream->SaveToFile(CurrentDir "agent.tmp");
    tempstream->Clear();
   }
  else                                                      //表示為舊檔
   {
    int buf_size=(int)tempstream->Size;
    char *buf=new char[buf_size 1];
    memset(buf,0,buf_size 1);
    memcpy(buf,tempstream->Memory,buf_size);
    AnsiString tempstring=(AnsiString)buf;
    tempstring=tempstring ScriptTitle;
    tempstream->Clear();
    tempstream->SetSize(tempstring.Length());
    memcpy(tempstream->Memory,tempstring.c_str(),tempstring.Length());
    tempstream->SaveToFile(CurrentDir "agent.tmp");
    tempstream->Clear();
    delete [] buf;
   }
   ::Sleep(30);
    //呼叫Agentlet起來run
    ShellExecuteEx(&ExecInfo);
    GetExitCodeProcess(ExecInfo.hProcess,&ExitCode);
     while(ExitCode==STILL_ACTIVE)
      {
       GetExitCodeProcess(ExecInfo.hProcess,&ExitCode);
       ::Sleep(10);
       Application->ProcessMessages();
      }
    //ENd
   ::Sleep(30);
   
    //讀取agent.tmp並加入尾巴並把他寫回agent.tmp
    tempstream->LoadFromFile(CurrentDir "agent.tmp");
    int buf_size=(int)tempstream->Size;
    char *tempbuf=new char[buf_size 1];
    memset(tempbuf,0,buf_size 1);
    memcpy(tempbuf,tempstream->Memory,buf_size);
    AnsiString tempscript=(AnsiString)tempbuf;
    tempscript=tempscript "";
    tempstream->Clear();
    //寫回agent.tmp
    tempstream->SetSize(tempscript.Length());
    memcpy(tempstream->Memory,tempscript.c_str(),tempscript.Length());
    tempstream->SaveToFile(CurrentDir "agent.tmp");
    //End        //Free memory
    delete [] tempbuf;
    delete tempstream;     ItemIndex  ;
麻煩各位了,不吝指教
系統時間:2024-05-04 3:34:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!