 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
ValorShi
註冊時間: 2005-12-19 文章: 6 來自: sz
第 1 樓
|
發表於: 星期一 十二月 19, 2005 11:04 am 文章主題: 关于在vfp中调用外部命令的问题,请各位大侠帮忙。 |
|
|
在vfp中调用外部命令有俩种方法。
1)RUN [/N] MS-DOSCommand | ProgramName
-or-
! [/N] MS-DOSCommand | ProgramName
2)DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND, STRING IpOperation, STRING IpFile, STRING IpParameters, STRING IpDiretory, INTEGER nShowCmd
我现在想在运行外部命令时不显示msdos窗口,并且要等待命令执行完毕才会执行下面的程序。
请问各位应该怎样做?
先谢谢了! |
|
回頂端 |
|
 |
ValorShi
註冊時間: 2005-12-19 文章: 6 來自: sz
第 2 樓
|
發表於: 星期一 十二月 19, 2005 3:16 pm 文章主題: |
|
|
怎么无人回复? |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 3 樓
|
發表於: 星期一 十二月 19, 2005 6:00 pm 文章主題: |
|
|
1. RUN /N7
*---------------- Run.prg -----------------------------
* Sample program to Execute an MS-DOS command and keep
* the MS-DOS window hidden.
*
* To use this function in FoxPro to create a new directory,
* use one of the following commands that illustrate two
* ways to call the function and achieve the same result:
*
* = run("MD C:\VFP\TESTDIR")
*
* DO run WITH "MD C:\VFP\TESTDIR"
*
FUNCTION run
PARAMETER doscmd
DECLARE INTEGER WinExec IN win32api AS run ;
STRING command, INTEGER param
* To have control over the visibility of the
* MS-DOS command, call it through a .pif file.
*
* IMPORTANT: (1) Be sure the "Close Window on Exit" check box in
* the PIF file is selected. (2) Be sure "Windowed" is the
* selected "Display Usage."
cmdstart = SYS(2004) + "FOXRUN.PIF /C "
* Now concatenate the two pieces of the command:
fullcmd = cmdstart + doscmd
retval = run(fullcmd, 0)
RETURN retval
*------- End of program ----------------------
2.ShellExecute 無法等待.
3. mydll 好像有這個功能, 請自己去查. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
ValorShi
註冊時間: 2005-12-19 文章: 6 來自: sz
第 4 樓
|
發表於: 星期二 十二月 20, 2005 10:51 am 文章主題: |
|
|
你说的方法都不能使程序等待。第3点麻烦你能不能说明白点。
我现在找到另一种办法,但我还没在vfp中测试成功。
Declare INTEGER CreateProcess IN kernel32;
STRING lpApplicationName,;
STRING lpCommandLine,;
INTEGER @ lpProcessAttributes,;
INTEGER @ lpThreadAttributes,;
INTEGER bInheritHandles,;
INTEGER dwCreationFlags,;
INTEGER @ lpEnvironment,;
STRING lpCurrentDirectory,;
STRING lpStartupInfo,;
STRING @ lpProcessInformation
Declare integer WaitForInputIdel in user32 integer hProcess,integer dwMillseconds |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 5 樓
|
發表於: 星期二 十二月 20, 2005 11:41 am 文章主題: |
|
|
去下載 mydll 來用
其中有一個功能
*-- 調用一個外部程序?等待結束
Declare INTEGER ShellExecWait IN "MYDLL.DLL" STRING lpProgName,STRING lpParms,SHORT n_ShowWinMode,INTEGER @ExitCode
或是直接用
DECLARE INTEGER ShellExecWait IN ShellExW.DLL STRING lpProgName, STRING lpParms, SHORT n_ShowWinMode, INTEGER @ExitCode
b = 0
a = ShellExecWait(".\rar.exe"+CHR(0),"A test.rar test.doc"+CHR(0),0, b)
if a <> 0 .or. b <> 0 then
messagebox(「壓縮失敗」)
endif _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
ValorShi
註冊時間: 2005-12-19 文章: 6 來自: sz
第 6 樓
|
發表於: 星期二 十二月 20, 2005 1:37 pm 文章主題: |
|
|
非常感谢!可以了。
另外我还想再问一个问题。
API 函数CreateProcess(见我的上个帖)创建的新进程的标识保存在一个结构变量里
Public Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
在vfp里怎样取这个结构的每一个元素的值? |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 7 樓
|
發表於: 星期二 十二月 20, 2005 2:03 pm 文章主題: |
|
|
資料來源: VFP精英站
如何檢查一個32位進程是否完成
在 Visual FoxPro 程序中執行 RUN/! 命令啟動另一個異步的可執行程序並返回控制到 Visual FoxPro 應用程序. 該外殼程序獨立於父程序 Visual FoxPro 應用程序持續地運行直到用戶關閉它.
但是, 如果你的 Visual FoxPro 應用程序需要等待子進程的終止, 你可以使用 Win32 CreateProcess 和 WaitForSingleObject API 函數. CreateProcess 開始一個子進程並用它的進程句柄裝配一個 PROCESS_INFORMATION 結構. WaitForSingleObject 接收該進程句柄作為一個參數, 並讓處理器處於非常有效的等待狀態直到子進程終止.
以下是生成一個用 CreateProcess() 函數來執行 Windows 記事本(Notepad.exe)程序的 Visual FoxPro 程序的必要步驟. 該代碼演示了如何使用 Windows API CreateProcess() 和 WaitForSingleObject() 函數來在恢復執行前, 等待直到外殼進程終止.
請注意這些代碼稍微有些複雜, 且工程師們可能需要一些時間來熟悉示例中的內容和概念.
逐步示例
創建一個包括以下代碼的示例 (Notepad.exe 所在的路徑可能需要修改來反映你的系統的配置):
#DEFINE NORMAL_PRIORITY_CLASS 32
#DEFINE IDLE_PRIORITY_CLASS 64
#DEFINE HIGH_PRIORITY_CLASS 128
#DEFINE REALTIME_PRIORITY_CLASS 1600
* Return code from WaitForSingleObject() if
* it timed out.
#DEFINE WAIT_TIMEOUT 0x00000102
* This controls how long, in milli secconds, WaitForSingleObject()
* waits before it times out. Change this to suit your preferences.
#DEFINE WAIT_INTERVAL 200
DECLARE INTEGER CreateProcess IN kernel32.DLL ;
INTEGER lpApplicationName, ;
STRING lpCommandLine, ;
INTEGER lpProcessAttributes, ;
INTEGER lpThreadAttributes, ;
INTEGER bInheritHandles, ;
INTEGER dwCreationFlags, ;
INTEGER lpEnvironment, ;
INTEGER lpCurrentDirectory, ;
STRING @lpStartupInfo, ;
STRING @lpProcessInformation
DECLARE INTEGER WaitForSingleObject IN kernel32.DLL ;
INTEGER hHandle, INTEGER dwMilliseconds
DECLARE INTEGER CloseHandle IN kernel32.DLL ;
INTEGER hObject
DECLARE INTEGER GetLastError IN kernel32.DLL
* STARTUPINFO is 68 bytes, of which we need to
* initially populate the 'cb' or Count of Bytes member
* with the overall length of the structure.
* The remainder should be 0-filled
start = long2str(6 + REPLICATE(CHR(0), 64)
* PROCESS_INFORMATION structure is 4 longs,
* or 4*4 bytes = 16 bytes, which we'll fill with nulls.
process_info = REPLICATE(CHR(0), 16)
* Start a copy of NOTEPAD (EXE name must be null-terminated)
File2Run = "C:\WINDOWS\NOTEPAD.EXE" + CHR(0)
* Call CreateProcess, obtain a process handle. Treat the
* application to run as the 'command line' argument, accept
* all other defaults. Important to pass the start and
* process_info by reference.
RetCode = CreateProcess(0, File2Run, 0, 0, 1, ;
NORMAL_PRIORITY_CLASS, 0, 0, @start, @process_info)
* Unable to run, exit now.
IF RetCode = 0
=MESSAGEBOX("Error occurred. Error code: ", GetLastError())
RETURN
ENDIF
* Extract the process handle from the
* PROCESS_INFORMATION structure.
hProcess = str2long(SUBSTR(process_info, 1, 4))
DO WHILE .T.
* Use timeout of TIMEOUT_INTERVAL msec so the display
* will be updated. Otherwise, the VFP window never repaints until
* the loop is exited.
IF WaitForSingleObject(hProcess, WAIT_INTERVAL) != WAIT_TIMEOUT
EXIT
ELSE
DOEVENTS
ENDIF
ENDDO
* Show a message box when we're done.
=MESSAGEBOX ("Process completed")
* Close the process handle afterwards.
RetCode = CloseHandle(hProcess)
RETURN
********************
FUNCTION long2str
********************
* Passed : 32-bit non-negative numeric value (m.longval)
* Returns : ASCII character representation of passed
* value in low-high format (m.retstr)
* Example :
* m.long = 999999
* m.longstr = long2str(m.long)
PARAMETERS m.longval
PRIVATE i, m.retstr
m.retstr = ""
FOR i = 24 TO 0 STEP -8
m.retstr = CHR(INT(m.longval/(2^i))) + m.retstr
m.longval = MOD(m.longval, (2^i))
NEXT
RETURN m.retstr
*******************
FUNCTION str2long
*******************
* Passed: 4-byte character string (m.longstr)
* in low-high ASCII format
* returns: long integer value
* example:
* m.longstr = "1111"
* m.longval = str2long(m.longstr)
PARAMETERS m.longstr
PRIVATE i, m.retval
m.retval = 0
FOR i = 0 TO 24 STEP 8
m.retval = m.retval + (ASC(m.longstr) * (2^i))
m.longstr = RIGHT(m.longstr, LEN(m.longstr) - 1)
NEXT
RETURN m.retval
按 CTRL+E 或單擊工具條中的運行按鈕來運行該程序.
一個記事本的拷貝將運行.
關閉記事本的拷貝. 在 Visual FoxPro 應用程序中, 顯示一個 "處理完成" 的信息框. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
ValorShi
註冊時間: 2005-12-19 文章: 6 來自: sz
第 8 樓
|
發表於: 星期二 十二月 20, 2005 4:03 pm 文章主題: |
|
|
多谢网友garfield,太感谢了,我也用GOOGLE搜了半天也没找到,可能是我搜的关键字不合适。garfield,实话说得好:授之以鱼不如授之以渔。你能不能教教我搜的技巧。我们可以交个朋友吗?我的MSN:VALORSHI@HOTMAIL.COM |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 9 樓
|
發表於: 星期二 十二月 20, 2005 5:16 pm 文章主題: |
|
|
其實我也是用 google 來搜尋,
用的關鍵字是 CreateProcess VFP ,
對我來說, 看英文有點累,
我會限定"只看中文網站"
萬一沒資料才去看"所有網站"
Google真的厲害,
它改變了以往研究學問的方式,
只要用關鍵字來搜尋,
所有在網路上找得到的資訊一下子就攤在眼前,
相信只要你常用它就會抓到訣竅.
交朋友當然可以, 只是我很少用 msn
因為我不大習慣在工作的時候被msn訊息打斷我的思緒,
又休閒的時候就被可愛的小孩纏住了,
所以連絡的方式還是email比較方便,
但如果是有關程式方面的問題,
我希望是在這個社區中提問,
畢竟你的問題也許別人也會遇到的,
在這個社區中提問後, google 也找得到,
可以提供有困惑的人一絲的光亮,
這就是網路世界帶給人的好處. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
ValorShi
註冊時間: 2005-12-19 文章: 6 來自: sz
第 10 樓
|
發表於: 星期二 十二月 20, 2005 6:23 pm 文章主題: |
|
|
Garfield,
不管怎样,再次多谢! |
|
回頂端 |
|
 |
jennher
註冊時間: 2004-09-16 文章: 5
第 11 樓
|
發表於: 星期四 三月 15, 2007 4:57 pm 文章主題: |
|
|
上述的程式碼 經過測試的結果 如果在 VFP 母體下 RUN , 98/XP/2K 環境都正常
但如果編譯成 .EXE 僅 98 環境可以 RUN
XP/2K 均不行
WaitForSingleObject(hProcess, WAIT_INTERVAL) 傳回 -1
不知上述程式要如何修正 才能在 XP/2K 下正常 RUN |
|
回頂端 |
|
 |
饿龙王
註冊時間: 2009-10-02 文章: 1
第 12 樓
|
發表於: 星期四 十二月 17, 2009 9:03 pm 文章主題: |
|
|
jennher 寫到: | 上述的程式碼 經過測試的結果 如果在 VFP 母體下 RUN , 98/XP/2K 環境都正常
但如果編譯成 .EXE 僅 98 環境可以 RUN
XP/2K 均不行
WaitForSingleObject(hProcess, WAIT_INTERVAL) 傳回 -1
不知上述程式要如何修正 才能在 XP/2K 下正常 RUN |
好像用CREATEPROCESS创建进程返回的进程句柄不对,用工具找了,没发现这个句柄。
我是用hProcess =ctobin(SUBSTR(process_info, 1, 4),"4rs")取得process_info里的句柄的。 |
|
回頂端 |
|
 |
goodnight

註冊時間: 2008-10-13 文章: 473 來自: 台南市
第 13 樓
|
發表於: 星期五 十二月 18, 2009 9:34 am 文章主題: |
|
|
大陸不是有個梅子vfp網站, 還有一個 vfp最後的基地, 你的問題在這兩個網站都有
甚至還有一堆 vfp 原始程式 , 不過據說都是反組譯得來的多 |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 14 樓
|
發表於: 星期二 一月 20, 2015 4:18 pm 文章主題: |
|
|
garfield 寫到: |
DECLARE INTEGER ShellExecWait IN ShellExW.DLL STRING lpProgName, STRING lpParms, SHORT n_ShowWinMode, INTEGER @ExitCode
|
這個方式不太正確.
因為 " ShellExW.DLL" 不是系統DLL.
http://www.databaseskill.com/4123820/
The best way to replace the VFP RUN command (the VC6 write ShellExW.DLL, source ShellExW.CPP to see my home page)
ShellExW.CPP - VC6 compiler generates a for VFP call. DLL _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|