VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

ShellExecute() 函數說明文件 2 (API)

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
朱育興



註冊時間: 2003-08-25
文章: 653
來自: 台中市大里區

第 1 樓

發表發表於: 星期四 九月 11, 2003 2:32 am    文章主題: ShellExecute() 函數說明文件 2 (API) 引言回覆

加強及補充前次發表的文件

ShellExecute() 函數說明文件(API)

FoxPro 宣告方式:(為了排版美觀,空格為全形空白,要複製程式碼測試時,請換為半形空白 2006/11/02 補)

DECLARE INTEGER ShellExecute IN shell32;
  INTEGER hwnd,;
  STRING lpOperation,;
  STRING lpFile,;
  STRING lpParameters,;
  STRING lpDirectory,;
  INTEGER nShowCmd


參數:
hwnd
 1.指定一個父視窗的代碼(Handle)值。
  (一個指派給視窗的數值,供作業系統追蹤視窗屬性)
 2.該應用程式所產生的視窗若有錯誤發生時會收到一個類似錯誤報告的訊息方塊。
 3.一般都設為 0。

lpOperation
 對指定檔案執行時所做的動作,有下列幾種選擇:(依該檔案所能提供的動作而定)
 edit  編輯
 explore 瀏覽
 find  搜尋
 open  開啟
 print  列印
 備註:
  該檔案所能提供的動作可由 檔案總管 --> 工具 --> 資料夾選項 --> 檔案類型
  --> 進階 --> 執行動作 可以查知。

lpFile
 指定執行所指派動作的檔案(可含完整路徑名稱)或物件名稱。

lpParameters
 若指定檔案是一個可執行檔案(executable file),且其後可下參數時,lpParameters
 就是存放該執行檔的參數內容。若無參數,補上 "" 即可。

lpDirectory
 程式執行的工作目錄。若為 "",表示採用預設的目錄。

nShowCmd
 指定執行該檔案時,其應用程式以何種方式顯示視窗:
 0 不顯示
 1 最大化
 2 最小化


傳回值:
 1.若執行成功,傳回大於 32 的數值。
 2.若失敗,有下列幾種回應值:
   2 錯誤的關聯 (例如:不合法的 URL)
  29 關聯失敗
  30 關聯應用程式忙碌中...
  31 沒有關聯任何應用程式


範例:(先宣告此 API)
* ---------------------------------------------------------------------------- *
 1.與指定的電腦之時間同步
  M_cComputerName --> 指定的電腦名稱
  =ShellExecute(0,"Open","NET.EXE","time \\"+M_cComputerName+" /set /yes","",0)

* ---------------------------------------------------------------------------- *
 2.檔案複製
  VFP 本身就有 COPY FILE ... 命令,但來源檔案必須是未被使用中才行,
  否則 VFP 會出現錯誤訊息,但改用下列方式就不會了。
  M_cSourceFile --> 來源檔案名稱
  M_cTargFile  --> 目的檔案名稱
  =ShellExecute(0,"Open","CMD.EXE","/c COPY "+M_cSourceFile+" "+M_cTargFile,"",0)
  =ShellExecute(0,"Open",GETENV("COMSPEC"),"/c COPY "+M_cSourceFile+" "+M_cTargFile,"",0)

  備註:
   1.若是 Win2000 以下的 OS,請將 CMD.EXE 換成 COMMAND.COM。
    不過在 VFP 中直接用 GETENV("COMSPEC") 就可以了,VFP 會自行判斷。
   2.事實上它就是在 DOS 模式下執行 DOS 內部指令 COPY 的動作,以 VFP 的做法如下
    ! COPY &M_cSourceFile. &M_cTargFile.
   3.將 nShowCmd 設為 0 就可令那討厭的 DOS 視窗完全不會出現;
    其他的 DOS 指令也可依此模式去做。

* ---------------------------------------------------------------------------- *
 3.發送一個給指定電腦的「信差服務」訊息方塊
  會提供這個案例,是公司有內部控管的需求。VFP 應用程式放在公司伺服器所在的電腦
  M_cSeverComputerName --> 公司伺服器所在的電腦名稱
  M_cUserIdR      --> 接收訊息的使用者名稱

  * 在那一臺電腦執行本程式
  M_cCurComputerName = ALLTRIM(LEFT(SYS(0),AT("#",SYS(0))-1))
  * 發送訊息的使用者名稱
  M_cUserIdS     = ALLTRIM(SUBSTR(SYS(0),AT("#",SYS(0))+1))

  * 在伺服器電腦上工作階段連線的電腦及其使用者
  * ---------------------------------- *
  * M_aSessionInfo(*,1) = C 使用者名稱
  * M_aSessionInfo(*,2) = C 電腦名稱
  * ---------------------------------- *
  DIMENSION M_aSessionInfo(1,2)
  STORE "" TO M_aSessionInfo

  * 只有伺服器的電腦才能產生 NetSession.TXT
  IF M_cCurComputerName == M_cSeverComputerName
   =STRTOFILE("NET.EXE SESSION > NetSession.TXT","Net.Bat")
   =ShellExecute(0,"Open","Net.Bat","","",0)
  ENDIF

  * 取得伺服器電腦上工作階段連線的電腦及其使用者
  IF ADIR(W1_aAdir,"NetSession.TXT") > 0
   W1_mComment = FILETOSTR("NetSession.TXT")
   STORE "" TO M_aSessionInfo
   W1_nRowOfSessionInfo = 0
   FOR W1_SUB_A = 1 TO MEMLINES(W1_mComment)
    W1_cLINE     = MLINE(W1_mComment,W1_SUB_A,0)
    W1_cHandle    = SUBSTR(W1_cLINE,1,2)      && 每列的表頭
    W1_cUserName   = ALLTRIM(SUBSTR(W1_cLINE,24,20)) && 使用者名稱
    W1_cComputerName = ALLTRIM(SUBSTR(W1_cLINE,3,20)) && 電腦名稱
    IF !W1_cHandle = "\\"
     LOOP
    ENDIF
    W1_nRowOfSessionInfo = W1_nRowOfSessionInfo + 1
    DIMENSION M_aSessionInfo(W1_nRowOfSessionInfo,2)
    M_aSessionInfo(W1_nRowOfSessionInfo,1) = W1_cUserName
    M_aSessionInfo(W1_nRowOfSessionInfo,2) = W1_cComputerName
   ENDFOR
  ENDIF

  * 傳送「信差服務」
  M_nCurRowOfSessionInfo = ASCAN(M_aSessionInfo,UPPER(ALLTRIM(M_cUserIdR)),1,-1,1,14)
  IF M_nCurRowOfSessionInfo > 0
   M_mMessage = "send " + M_aSessionInfo(M_nCurRowOfSessionInfo,2) + ;
          " " + M_cUserIdS + "發訊息給 " + ALLTRIM(M_cUserIdR) + ;
          ":" + CHR(13) + CHR(10) + CHR(13) + CHR(10) + ;
          "有一封信件到管理室領取"
   =ShellExecute(0,"Open","net.exe",M_mMessage,"",0)
  ENDIF
  備註:
   1.本 ASCAN() 函數的參數使用是 7.0 版的環境,6.0 版或以下版本,請自行改寫。
   2.實際上 NetSession.TXT 的產生是公司伺服器將程式放在工作排程中執行,
    且每 5 分鐘更新一次(這細節不便說明)。
   3.傳送後,接收訊息的使用者就會在其桌面出現「信差服務」訊息方塊。
   4.傳送「信差服務」這一段實際上是在一個 SCAN ... ENDSCAN 中,
    在這娷略々漁e。若要做個簡單測試,將電腦名稱都指定自己的電腦,
    發送及接收的使用者名稱也指定自己(就是一開始進入 Windows 登錄的名稱),
    我想這樣在自己的單機上測試就可達到效果。
* ---------------------------------------------------------------------------- *


後記:
 1.這是我使用此 API 的心得,當中若有不正確或須補充的地方,煩請各位能告知我,
  以便將此 API 的說明更加完備。
 2.以後若有實際上應用的範例會繼續提供,也希望各位若有實際應用的例子,
  也祈盼分享出來。


朱育興 在 星期四 十一月 02, 2006 1:15 pm 作了第 1 次修改
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
奔跑的愛情



註冊時間: 2003-08-28
文章: 27


第 2 樓

發表發表於: 星期三 十月 15, 2003 1:46 pm    文章主題: 引言回覆

好文,不過第一在什麼地方呢?
_________________
delphi vf sql
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
goto-dream



註冊時間: 2004-05-11
文章: 909


第 3 樓

發表發表於: 星期二 六月 01, 2004 5:28 pm    文章主題: 引言回覆

引言回覆:

好文,不過第一在什麼地方呢?



前一篇文章在這裡!!

ShellExecute() 函數說明文件(API)
http://vfp.sunyear.com.tw/viewtopic.php?t=443&highlight=

_________________
福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!

想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.

          愛作夢
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
lcm



註冊時間: 2004-12-27
文章: 45


第 4 樓

發表發表於: 星期二 十一月 01, 2005 10:12 pm    文章主題: 引言回覆

請問執行ShellExecute()是否要等所執行的程式結束後,才會繼續其後的程式碼?謝謝
回頂端
檢視會員個人資料 發送私人訊息
朱育興



註冊時間: 2003-08-25
文章: 653
來自: 台中市大里區

第 5 樓

發表發表於: 星期三 十一月 02, 2005 12:39 am    文章主題: 引言回覆

記得是不會,若需要所執行的程式的結果,就要利用延遲的效果讓該程式結束後才繼續其後的程式碼

這類範例應該不少,只是忘記用什麼關鍵詞去搜索了

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2062


第 6 樓

發表發表於: 星期四 十一月 02, 2006 11:48 am    文章主題: 引言回覆

測試用 DECLARE INTEGER ShellExecute IN shell32;
  INTEGER mhwnd,;
  STRING lpOperation,;
  STRING lpFile,;
  STRING lpParameters,;
  STRING lpDirectory,;
  INTEGER nShowCmd

執行? ShellExecute(0,"Open","CMD.EXE","/c COPY c:\temp\temp.dbf c:\temp\temp.txt","",0)
會出現錯誤.
但用
Declare Integer ShellExecute In shell32.Dll Integer, String, String, String, String, Integer
執行? ShellExecute(0,"Open","CMD.EXE","/c COPY c:\temp\temp.dbf c:\temp\temp.txt","",0)
確很正常 ???
不知錯在那裡?

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
朱育興



註冊時間: 2003-08-25
文章: 653
來自: 台中市大里區

第 7 樓

發表發表於: 星期四 十一月 02, 2006 1:10 pm    文章主題: 引言回覆

那是因為直接複製我的範例時,空格是全形空白,所以宣告時就不會正確,把全形空白換為半形再執行就可以了
_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2062


第 8 樓

發表發表於: 星期五 十一月 03, 2006 2:57 am    文章主題: 引言回覆

原來如此, 我才覺得看起來沒問題, 怎麼執行起來就是有問題,
眼睛是會騙人的.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
syntech



註冊時間: 2003-05-16
文章: 3832
來自: Taipei,Taiwan

第 9 樓

發表發表於: 星期五 十一月 03, 2006 1:45 pm    文章主題: 引言回覆

一語驚醒夢中人.嚇得我屁滾尿流失了魂~~~~~ 建寧公主. ^_^

我也常常這樣做,讓POST出來的版面好看一點.
或是一些保留字改用全形等等.
以後要記得提醒別人.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作