| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2157 人关注过本帖, 2 人收藏
标题:再論用VFP寫.exe獨立可執行文件的方法
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(2)
 问题点数:0 回复次数:9 
再論用VFP寫.exe獨立可執行文件的方法
關於如何編寫獨立可執行程序的問題,我之前發了一個帖子:https://bbs.bccn.net/thread-345967-1-1.html,現在給點補充。

啓動程序的代碼例子如下:
程序代码:
CLEAR ALL
CLEAR
IF Application.StartMode == 0
    SET DEFAULT TO (Application.ActiveProject.HomeDir)
ENDIF
SET PATH TO "Data" ADDITIVE
SET PROCEDURE TO myForm ADDITIVE
Main()
CLEAR ALL
RETURN

PROCEDURE Main()
    LOCAL loMainForm
    loMainForm = CREATEOBJECT("C_MainForm")
    WITH loMainForm
        .Caption = "Test"
        .AutoCenter = .T.
        .Show
    ENDWITH
    READ EVENTS
ENDPROC


這裏,Main()函數是程序的入口,之所以寫在函數中而不是在外部,是因爲我有點潔癖,對象變量loMainForm將會在Main()函數結束後自動釋放内存資源(因爲這是局部變量LOCAL),如果寫在外部,屬於全局變量,則需要主動釋放,即RELEASE這個變量。

在前面的準備工作(這個代碼的準備工作,後面將會詳細説明,很重要的),如清除殘存資源,設定各種路徑和初始化之後,啓動窗體loMainForm,關鍵之處是在Show出窗體之後,必須發出READ EVENTS指令,啓動所謂的“事務處理”過程——這是Windows程序的共同特徵,那是一個死循環,不斷地等待消息和處理消息的,寫過C/C++下Windows程序的人都知道必須寫兩個函數,而不是像控制臺那樣衹有一個,其中一個就是死循環函數。如果沒有這個循環,程序就會“一閃而過”。

這裏,如果你的窗體是模式窗體,即WindowType=1,那麽,是無需用READ EVENTS的!

啓動事務處理循環之後,必須在適當時候取消,用CLEAR EVENTS指令,這個指令的最佳位置是在窗體關閉并從内存中釋放的時候,那個事件是Destroy事件。


[ 本帖最后由 TonyDeng 于 2015-2-27 21:15 编辑 ]
搜索更多相关主题的帖子: 如何 
2015-02-26 11:24
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
編寫獨立可執行程序,即.exe文件,目的無非是要把這個程序發佈到不同的計算機中,那麽用戶把程序放到什麽目錄(文件夾)中是不確定的,所以我們千萬不能在程序中寫硬編碼,把自己開發時的文件夾路徑寫在代碼中,那樣强迫用戶把程序放在跟你開發時同樣的位置,是沒有人性的。

程序的執行,它首先在自己所在的位置開始搜索文件,這個就是它的主目錄,亦稱(程序)根目錄,這個位置最好不要在程序中用SET DEFAULT TO指令隨意變化,一開始設定好後,就不要再變了。1樓的準備代碼就看到這種設置。

由於程序編譯爲獨立可執行文件發佈,在開發時的所有源代碼文件,是不需要發佈出去的,所以我把源代碼都放在一個單獨的目錄中(事實上還有別的通用工具源代碼目錄),而在開發時,這個“根”目錄與將來的“根”目錄不一致,調試時稍爲複雜一點。解決的辦法如下:

一般我們總是創建Project來管理開發,而Project是有屬性設置的,見下面畫面的設置:
图片附件: 游客没有浏览图片的权限,请 登录注册

Home部分,就是Project的“根”目錄,在這個位置寫入準備放置.exe文件的位置,那麽在IDE下調試程序的目錄就跟發佈的時候一樣。爲此,必須在代碼中檢測當前以什麽模式啓動,Application是當前應用的對象,其中ActivateProject是當前活動的Project,HomeDir就是上面設置的路徑,StartMode=0表示現在的VFP是在IDE下。那段代碼的意思是這樣:如果當前程序是在VFP IDE下運行,那麽就應該取Project的HomeDir作爲程序的“根”目錄,而程序將來發佈後,是不需要這個東西的,在哪裏啓動,“根”目錄就在哪裏。

SET PATH TO指定數據庫數據的搜索位置。與源代碼集中管理一樣,數據庫的文件也應集中分類管理,所以我的數據庫文件是放在“根”目錄下名爲Data的子文件夾中的,搜索路徑指定到那裏即可。注意那個格式,那是相對路徑,也不要寫絕對路徑(如果數據文件放在更廣汎的局域網目錄内,另外用外部設置給出,也不要硬編碼,那就是config的思想,很多規範的應用軟件都是那樣做的,我通常寫在config.fpw中)。

這是解決程序發佈在不同目錄下的方法。

附我的文件夾結構:
图片附件: 游客没有浏览图片的权限,请 登录注册

發佈的時候,不要發佈Source。


[ 本帖最后由 TonyDeng 于 2015-2-26 11:56 编辑 ]

授人以渔,不授人以鱼。
2015-02-26 11:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
編寫獨立可執行文件,是要徹底脫離VFP IDE窗口的,很多人用隱藏_SCREEN的方法,其實那是假的,_SCREEN窗體仍然在内存中佔著,隱藏衹是看不到而已,不是沒啓動,它還是在背後起作用。這跟你寫的窗體Hide了之後,還可以在後臺操作數據和活動,是同樣的道理。

徹底不啓動_SCREEN的辦法,是在程序啓動之前就通知VFP運行庫,不要啓動那個東西,所以設置不是在程序代碼中的,是在config.fpw文件中,那個文件這樣寫:
SCREEN = OFF
RESOURCE = OFF

第一行是不啓動_SCREEN,第二行是不要生成那兩個資源文件。

這個配置文件,正如在2樓所看到的圖片,我的.exe目錄中沒有,事實上它放在Source中,而且被我包含在Project中了,它在編譯後被嵌入到.exe内部,再也不用在外面搜索和存放,這樣同時也避免了外人在外部對config.fpw動手脚的可能。

授人以渔,不授人以鱼。
2015-02-26 12:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面談談編譯的問題。

見2樓第一張圖,我取消了Debug Info的勾選,那樣程序在編譯之後,是無法被Debugger跟蹤調試的,這是加密的第一步。然後,勾選Encrypted,那是對編譯後的目標代碼加密,對PRG代碼,我測試過用任何VFP反編譯工具都無法反編譯,而對SCX的窗體程序,是仍然可以被反編譯出來的。所以,我從來不寫SCX。

授人以渔,不授人以鱼。
2015-02-26 12:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
關於“一閃而過”的問題:Windows模式下(區別於控制臺)的程序,都是事件驅動的。事件驅動是面向對象的核心思想,程序的運作,是由各種各樣的事件以未知順序激發表現出來的,所以它必定要等待事件,這就是必須要以死循環運行的原理,一旦主程序不進入死循環,就是“一閃而過”。

傳統的C程序是面向過程的,由代碼驅動,程序的行爲由代碼强制好每一個步驟,但面向對象的編程思想則與之相反,它的前提是完全不知道下一步將會發生什麽但又必須要作出響應。我從來就說,學C越深,學C++則越困難,阻力越大,原因就在這裏。事實上很多C派的程序員是抗拒C++的,道理也在這裏,因爲思想格格不入。

[ 本帖最后由 TonyDeng 于 2015-2-27 21:28 编辑 ]

授人以渔,不授人以鱼。
2015-02-27 21:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用y148y在2015-3-18 17:51:37的发言:

请教如何解决:在config.fpw文件中代码设为,
   RESOURCE = OFF
运行会出现错提示如下:
   无法打开文件 FOXUSER.dbf

不知道你運行什麽,怎麽運行。

授人以渔,不授人以鱼。
2015-03-19 22:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把那兩個文件編譯進執行文件了吧?

授人以渔,不授人以鱼。
2015-03-20 22:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我已經發了兩帖,詳細地把實現的步驟的細節都介紹到了,自己不行,就對照一下有哪些地方跟我描述是不一致的、有哪些地方是自己沒提到的。總之,人家可以,你不可以,就一定是你自己的問題,要麽發出全部的東西,要保密的話,就自己琢磨。

授人以渔,不授人以鱼。
2015-03-20 22:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
正確操作是foxuser.*的兩個文檔都不要包含(磁盤上也不需要有這兩個文檔存在),衹包含config.fpw。那個是記憶VFP IDE環境的,編譯獨立執行的程序,已經脫離IDE,所以不需要再記憶。另一方面,製作的程序,窗體也不要有VFP的主窗體。出現這類問題,大多是仍然使用了_Screen。

授人以渔,不授人以鱼。
2015-03-22 12:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我介紹如何製作獨立可執行程序的兩篇帖子,第一篇就詳細講爲什麽要設置窗體的ShowWindow=2,那是配套措施。明白了原理,才能知道一整套動作怎麽做,否則靠別人說如此這般而不明白原理,始終會出錯,到時也不知道該怎麽改,若再與別的東西有牽扯,更亂。這就是我强調要明白原理的原因,太多人總是求到某次具體動作就以爲懂了,到後來還不是多次看見他出來求救同類問題?

授人以渔,不授人以鱼。
2015-03-22 12:20
快速回复:再論用VFP寫.exe獨立可執行文件的方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033717 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved