| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3045 人关注过本帖, 5 人收藏
标题:VFP程序編譯為獨立可執行文件EXE時不顯示_SCREEN窗口的方法
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(5)
已结贴  问题点数:20 回复次数:4 
VFP程序編譯為獨立可執行文件EXE時不顯示_SCREEN窗口的方法
看到壇上很多人問過這個問題,特貢獻本帖供大家參考。

先解釋原理:VFP其實是一種解釋語言,不是編譯語言,即使其程序被編譯為EXE形式,其實也是需要被VFP解釋器解釋執行的,但這個解釋器在VFP語言包中,是作爲運行庫提供的,只要程序使用VFP語言,發出調用消息,操作系統就會啓動解釋器執行程序的代碼,所以,VFP中的_SCREEN窗口,其實也是一個用VFP寫成的窗體,是外掛的東西,我們完全可以不需要它就能執行程序。在Windows中,每個窗體基本上是一個進程,即所謂的頂部窗體(Top窗體,設置窗體屬性ShowWindow = 2),在這個窗體内部的子窗體,其窗體屬性是ShowWindow = 1。VFP設置了兩個頂部窗體,一個是語言包專用的_SCREEN窗體,它永遠是ShowWindow = 2的,如果要建立在這個窗體下的子窗體,一般是ShowWindow = 0,這是平常我們創建窗體時的默認值。因此,要創建獨立於_SCREEN窗體之外的頂部窗體,必須令此窗體的ShowWindow = 2,然後新創建的ShowWindow = 1的子窗體,才會在這個頂部窗體之下。

但是,因爲VFP有兩個頂部窗體,即使你程序中建立了自己的頂部窗體,也無法阻止_SCREEN窗體的啓動,因爲它的地位與你新建的ShowWindow = 2的窗體是一樣的,甚至有更高的優先權。禁止這個窗體啓動,是不可能在自己寫的程序中操作的,因爲在你這個程序啓動能夠起作用之前,_SCREEN窗體已經搶先啓動了,除非你調用Windows系統消息命令對方關閉,否則你無法控制別人的行動。這就是很多人繌是說,即使寫了_SCREEN.Visible = .F.,_SCREEN窗體仍然存在的原因,在Windows的任務欄會看到兩隻狐狸頭。VFP有自己的解決辦法,程序外部的問題必須在程序外部解決,那就是外部配置文件config.fpw文件,這個文件是比任何程序都早執行的,它纔是決定VFP程序運行模式的總指揮,它有很多超級指令,是控制VFP的整體行爲的,查查幫助信息就看到這些指令是什麽了。一般地,當編譯的EXE程序啓動時,它首先在自己所在的目錄中檢索config.fpw文件,如果存在,就先執行其中的指令,然後才正式啓動自己;如果這裡沒有這個文件,就到VFP的安裝目錄中找,都沒有,就按默認配置運行。所以,爲了徹底地禁止_SCREEN窗體的啓動,除了上面所說的ShowWindow屬性設置之外,還要在EXE的啓動目錄中放置config.fpw文件,控制這個程序的啓動行爲。具體操作如下:

用記事本編輯文本文件config.fpw,或在命令窗口通過MODIFY COMMAND config.fpw建立,輸入下面的代碼,保存即可。

SCREEN = OFF            && 不啓動_SCREEN窗體
RESOURCE = OFF          && 不生成FOXUSER數據表


補充:這個config.fpw可以連編到EXE中,以防止別人修改干擾程序的運行,如果惡意者能夠對你的程序做什麽動作,這是一個很好的入手點。

[ 本帖最后由 TonyDeng 于 2011-7-24 12:23 编辑 ]
搜索更多相关主题的帖子: Windows 消息 
2011-07-24 12:11
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:20 
楼主解释的很详细啊。当初我刚用顶层表单时,就为无法关闭VFP主窗口而苦恼,网上查找资料,有设置主窗口属性visible=.f.的,也有将主窗口显示位置设置在屏幕之外的,最后是通过在config.fpw文件中写入screen=off,才彻底关闭了VFP的主窗口。但为什么要这样做就没有深究了。
收到的鲜花
  • TonyDeng2011-07-24 15:01 送鲜花  10朵   附言:享受一下送分的感覺~

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2011-07-24 14:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,我就是看到太多人問這個問題,才特意發的此帖。詳細講解原理,才能知道到底發生了什麽事,知道如何解決。比如,有人說隱藏了_SCREEN窗口,結果連程序自己的窗體也不見了,就多數是自己建立的窗體ShowWindow = 1所致,這種子窗體,如果不存在ShowWindow = 2的頂部窗口,它就是等價於ShowWindow = 0即_SCREEN窗口下的子窗體,隱藏了_SCREEN窗口,自然連它的子孫也一併隱藏了;也有說看不到窗口,但在進程管理器中看到有進程在運行的,多數也是這種狀況。

[ 本帖最后由 TonyDeng 于 2011-7-24 14:52 编辑 ]

授人以渔,不授人以鱼。
2011-07-24 14:44
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:0 
以下是引用TonyDeng在2011-7-24 14:44:42的发言:

是的,我就是看到太多人問這個問題,才特意發的此帖。詳細講解原理,才能知道到底發生了什麽事,知道如何解決。比如,有人說隱藏了_SCREEN窗口,結果連程序自己的窗體也不見了,就多數是自己建立的窗體ShowWindow = 1所致,這種子窗體,如果不存在ShowWindow = 2的頂部窗口,它就是等價於ShowWindow = 0即_SCREEN窗口下的子窗體,隱藏了_SCREEN窗口,自然連它的子孫也一併隱藏了;也有說看不到窗口,但在進程管理器中看到有進程在運行的,多數也是這種狀況。
一并隐藏的作用,提供了VFP制作病毒程序的可能性。让一般人看不见,但在背地里运行着——这是病毒的基本特征。
TonyDeng 这样的理解是否对?

[ 本帖最后由 wengjl 于 2012-1-13 08:40 编辑 ]

只求每天有一丁点儿的进步就可以了
2012-01-13 08:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
病毒的基本特徵是擴散,其主要生存方式是寄生。像這裡所說的“不可視”(Visible = .F.)運行,不算是病毒的表現,因為其實是顯式啟動進程運行的,在任務欄和資源管理器中都可見,何況,程序的本體就是這樣運行,要說它是病毒,這整個程序就是病毒,不是寄生。病毒要麼是第三者強行植入某個軟件中,寄生在這個軟件身上,在軟件運行時附帶啟動自己;要麼是軟件製作者自己寫上去的,是軟件的一部分。因此,“病毒”的概念很難界定。

VFP編寫的程序,其實也可以寫到連任務欄和狀態托盤都看不到,以純進程的方式運行(即所謂的服務),這樣比上述的更隱蔽,但不算是病毒。其實,主要是看編寫者是否惡意罷了,有意的,用什麼編寫都有辦法。

授人以渔,不授人以鱼。
2012-01-13 20:29
快速回复:VFP程序編譯為獨立可執行文件EXE時不顯示_SCREEN窗口的方法
数据加载中...
 
   



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

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