Labwindows掃盲+技巧貼,CVI學習必看
http://www.vihome.com.cn/bbs/viewthread.php?tid=4675
Labwindows掃盲+技巧貼,CVI學習必看
1.、CVI適合什麼人使用?
( R2 P. G H$ T% ?8 z# WCVI是基於ANSI C的快速開發環境,適用於有C,C++基礎。使用VB,VC,BC運用控制項式組織使用者介面的工程師。% s# E6 P; {8 X
* w3 X$ e; { P m- y8 P5 y L
2、CVI有幾種版本?, T5 C* j' I0 C) z
NI分為labwindows Full development system,labwindows base development system。價格分別為20450,10220RMB。7 k% h! Q1 m6 |% z9 i5 s1 X8 ~
完整版RMB204501 v% /( B7 C5 H# h
•儀器控制、資料擷取和自動化測試的首選
•完整的分析庫,包括曲線擬合和訊號處理
•網際網路串連
•調用Measurement Studio程式
2 @6 q3 G" ]3 [8 w基本版RMB10220
$ S, A* h+ @8 r- R- Y
•整合式開發環境
•完整的專業使用者控制群組
•儀器I/O和DAQ助手
•IVI驅動串連
•.NET和ActiveX支援
; P, O3 N3 I+ ?0 ^, /
0 p6 q9 |9 _$ G! F. |/ i" F7 F- X6 K F" f1 Y9 _
目前最新的是8.11版,是CVI的版本曆史:- W( k. i ~3 B# `- h* B6 V
, Q, E7 ?. m8 B2 ~
3、CVI開發的程式能否***運行?
$ M; f% S) i) ^# d) u可以。和所有的開發工具一樣,CVI編寫的程式只要提供CVI運行支援庫(CVI runtime)即可。
% C8 ?: |* i' t" m3 ?9 T9 W+ H
Z7 Y Y! K3 x' j9 ]4、CVI的運行支援庫在哪裡下載?$ ?) x' b2 u" T$ `, x
LabWindows/CVI Run-Time Engine 8.1.1 for Windows 2000/Vista x64/Vista x86/XP
5 H0 g8 b9 n# x/ A" B% |http://ftp.ni.com/support/softlib/labwindows/cvi/Run-Time%20Engines/8.1.1/NILWCVIRTE811.exe
+ j" o5 z1 b4 y* U- j7 V J) a- g# s. E6 r$ p, o8 g
5、是否要每次手動安裝支援庫?
' F; p% p0 ?, S否,CVI程式帶有發布功能。自動生存你項目需要的所有運行庫。
0 c' R2 H0 |7 H( @5 r4 G+ T菜單Build——distributions下。
( g/ g. H. q- Q6 i/ U( F [$ z' h N1 C6 N
6、EXE程式的資訊在哪裡定義?
- ?* Y: C8 W+ / c' ] ?菜單Build——Build steps...下可以更改EXE的表徵圖,著作權資訊等等。( z$ Y9 }" G* d: `$ E' e
) |8 m! t5 L! {) k% i, S7、新手怎麼開始學習CVI? b) S2 C' i$ K
新手可以先看看這些書籍和資料。
2 K" `. z, y, ~6 N: Y. h$ Y# o% V5 X% thttp://www.vihome.com.cn/bbs/thread-4658-1-1.html: y9 B4 B7 S/ V2 T
http://www.vihome.com.cn/bbs/thread-3180-1-1.html. y( w K2 _- _5 c( x. O
http://www.vihome.com.cn/bbs/thread-3173-1-1.html
, v3 ?$ i @' N; X- }0 G# E) T6 W9 h! T8 S }. u
8、CVI在哪裡下載?, W' B3 @ L. S7 W
http://www.vihome.com.cn/bbs/thread-4667-1-1.html, n$ b, C% W4 a I' U
http://www.vihome.com.cn/sq/?uid/4829
! K1 ?9 @7 f; _ |% K9 d# ]) s b! ?/ o& y3 Q# /6 `9 V
9、如何在CVI中獲得系統資訊9 y5 g/ A0 q+ n* Q6 /: A1 Y, y
使用CVI提供的toolbox:" h7 E a4 @+ F
4 J, s3 L" e) i
GetWinOSVersion獲得作業系統資訊:: ]: y( `1 L7 ?$ y, G( G
: ~" k4 ~ D7 _3 Q VGetWindowsDirs獲得Windows目錄# }1 o( g! ? A! _
C( e4 g, P5 w8 I% uGetDiskSpace得到磁碟空間大小,對於檔案儲存有用,先判斷磁碟大小再儲存,否則提示。
9 v! z# b( q9 U [
: |! u6 M# U3 j8 Z, X$ @GetMemoryInfo獲得記憶體資訊。* S* g# }6 v+ /! O, @0 l8 z, D
0 }* A2 a9 C) ?; W' nGetDiskSpace ("C:", totalBytes64, &freeBytes64);
) x Z, s# A. KdiskSpaceMB = (double)totalBytes64.hiBytes * 4096. +7 { _( b, q( O
(double)totalBytes64.loBytes/1048576.; [$ [( T) f/ v, p( i9 K
freeSpaceMB = (double)freeBytes64.hiBytes * 4096. +; O! A) s# }" |5 v) p8 I
(double)freeBytes64.loBytes/1048576.;# i5 b# v o7 z s" t
- u6 [. A5 F! ?; S* y9、cvi中如何開啟別的應用程式檔案,如Doc,PDF,HLP?/ q. z3 l. [( @; U0 M! J4 q
OpenDocumentInDefaultViewer ("c:/aaa.pdf", VAL_NO_ZOOM);7 [( ~5 v2 x n
6 T9 R+ o" n ? u z# i1 Y. c1 X1 ]" o5 L0 {
10、怎麼在CVI中使用非NI公司的PCI板卡?
! W( H* p. X9 B' t- S: h e7 u其它廠家雖然沒有NI這樣的FP檔案或嚮導,但都提供DLL動態連結程式庫使用。VCBC,CVI通用。
5 |3 Q% o8 j* p. _+ }3 ]2 x# d. Z
: h$ w+ J6 J/ t- }11、如何使用DLL?, S# ]2 i t- Z& a- z/ C5 g% j
需要DLL檔案和H標頭檔,LIB檔案。#inlcude "標頭檔名.h"加入CVI中。將*.lib檔案加入工程中。工程右擊——add file...即可使用DLL。
: z# ~. D) y( j% b2 V5 s
9 z# C. p0 _2 ^9 ]# y12、沒有LIB檔案如何使用DLL?) F- l' q1 K% d) [4 D" Q
在CVI菜單中開啟DLL相應的.h檔案。Option——Generate DLL Import Library選擇DLL檔案,即可生存LIB檔案。: w- j, m! y( D/ [8 o6 [0 U! }! N
4 ^+ D0 B$ i! p1 X. M13、如何根據DLL和.H檔案看到C代碼? ^8 ~4 K7 h: |: V" ?
Option——Generate DLL Import source選擇DLL檔案,即可生存C檔案。不過只有函數定義,原始碼就不用想了,現在還沒有DLL的破解。
5 ^ q9 ?1 s! ^5 H! q" E: o9 ~- V3 a4 t
14、如何建立DLL程式檔案?$ z0 J0 D7 N+ X7 L M, /
Build——Target Type——Dynamic Link Library ,即可將當前的工程生存DLL形式。同理Static Library生存Lib形式。
$ }) V$ Z5 V# H% T
3 E: Y$ i+ P A" z) k3 f3 e15、運行時視窗的響應慢,顯示不及時?
( L! E$ o; E) s/ ^( v# fCVI是事件驅動式的運行方法,排隊響應個個事件。造成顯示滯後。需要強制在函數中加入ProcessSystemEvent()。當然有效方法是使用CVI或API的多線程技術。
A4 q0 z. C/ W/ t" C: |( G
6 t9 x9 m. V* w( A8 A: t16、CVI中擷取本機電腦的IP地址" m6 h; ~3 {, e( x4 I7 w
可以調用 GetTCPHostAddr 函數。需要注意的是,該函數擷取的是當前程式啟動並執行電腦的預設IP地址。GetTCPHostAddr 函數會向Windows作業系統擷取所有可用的IP地址的列表,但返回的只是其中的第一個。. x$ a4 k" i v! T2 [- b! j3 `
同樣地,如果要擷取該電腦的所有IP地址,可以調用GetAllTCPHostAddresses 函數來實現。; [$ v0 C) x, }9 b+ G
0 O* |" d- j+ M. Q6 M
17、CVI如何?右鍵菜單功能?9 I1 P0 w( c2 m
調用編輯好的右鍵菜單可以使用以下兩個函數實現:0 Q. G7 ~" m( s) b; V
menuHandle = LoadMenuBar (0, "popupmenu.uir", MENUBAR);* {( ?. Q$ S- W- v/ C4 b
RunPopupMenu (menuHandle, MENUBAR_MENU1, panel, eventData1, eventData2, 1, 1, 1, 1); : Q; ^; u2 I: V' A4 V
4 {8 q: s H* @* U' s2 R
18、CVI對多線程的如何支援?: k3 k" Y d) z, ?+ h
CVI對多線程的支援(1)概念篇
) g7 _. t: ^# g【 原帖地址:http://easons.blogbus.com/logs/2006/04/2366573.html】1 l, Q. Q: d( z+ G
多線程對於windows應用程式來說,並不是什麼先進的技術,開啟你的工作管理員,選擇“進程”分頁,點擊菜單的在“查看”->選擇列,在“執行緒計數”前打勾,確定後你在“進程”分頁裡頭看到現在在啟動並執行絕大多數程式都基於2個以上的線程。9 Z! y2 h3 p- ?8 Z+ y! A/ g9 N9 u! b
那麼進程線程的概念以及他們之間的關係又是什麼呢?, K, ?' F l6 U' I
線程技術是指開發架構將應用程式的一部分分離為“線程”,使線程與程式其餘部分執行步驟不一致。線程是一種特殊的對象,是作業系統執行多任務的一部分,它允許應用程式的一部分***於其他對象而單獨運行,因此也就脫離了應用程式的常規執行順序。
( S+ b# c g2 E F# l ]% X2 a8 k 目前主流的Windows系統都是基於多任務機制,即可同時運行多個應用程式(“應用程式”這個詞並不恰當,恰當的說法是“進程”)。當啟動應用程式時,系統就會為該應用程式分配所需的記憶體以及其他資源。記憶體和資源的物理分離叫做進程。換言之,進程是應用程式的一個運行執行個體,當然,應用程式可以啟動多個進程。每個進程至少有一個基本線程(主線程)。線程與資料一起隔離在某一物理地區,在進程中聲明的資料可通過該線程進行訪問。
' ` J4 S7 S O Windows作業系統為搶佔式多任務運行機制,即採用時間片輪換的方式來執行多任務,時間片輪換的基本對象是線程。作業系統為每一個線程分配時間片,讓該線程在這個時間段內運行,之後中斷該線程的運行,啟動另外的線程執行。多線程技術的優勢在於將進程分解,在主線程外產生一個或幾個輔助線程,用於完成如資料擷取、網路訪問、資料存放區等後台工作。
8 n' U4 a9 F3 dCVI對多線程的支援(2)基本原理
: ]# ~- R% @ w# |. w z; C2 s【原帖地址:http://easons.blogbus.com/logs/2006/05/2518754.html】5 r- T3 F1 g+ n; p/ F6 x6 A
在典型的LabWindws/CVI多線程程式中,使用下線程建立、顯示並運行使用者介面,在次線程中,運行其它的對時間要求很高的操作[3]。LabWindows/CVI提供了兩種設計輔助線程的機制,分別為線程池(thread pools)和非同步定時器(asynchronous timers),線程池適用於需要不連續地執行多次或在迴圈中執行的任務,而非同步定時器適用於在固定時間間隔內執行的任務(只支援一個輔助線程),若要使用多個輔助線程,只能採用線程池技術。
4 u$ y Z/ f* B5 u' l3 | 多線程的建立% u1 ^, D- w( X, A8 t
線程池機制中輔助線程的建立是通過調用實用庫(Utility Library)的CmtScheduleThreadPoolFunction Adv函數,把想要在次線程中啟動並執行函數名傳遞給它,線程池調用這個函數在它的其中一個線程中運行。根據線程池的設定和目前狀態,線程池建立一個新的輔助線程,使用一個已經存在的空閑線程,或等待一個活動的線程空閑來執行需要調度的函數。' t" D. s; b D7 e) m
多線程間的資料安全) C7 y; Y$ Q; V# b X" [) j
資料保護是在使用輔助線程時必須要解決的關鍵問題,防止多個線程同時操作某一變數,導致邏輯錯誤,是多線程協調啟動並執行重要內容。在CVI中,系統提供了線程鎖(blocked)、安全執行緒變數(thread safe variables)和安全執行緒隊列(thread safe queues)三種機制來保護共用資料,實現線程間安全的資料轉送。其中安全執行緒隊列保護機制傳輸資料量大;且讀取資料和寫資料互不影響;資料轉送基於事件模式,可以註冊讀取資料和寫資料回呼函數在隊列資料達到指定數量才被調用。基於多線程監控程式的典型應用為:輔助線程採集處理大量資料並傳遞給主線程進行顯示,安全執行緒隊列機制是最佳的選擇。
! E6 ^/ t% `. m; X6 ^2 @7 ^$ W+ W- U寫入線程把要傳送給讀出線程的資料打包後寫入到資料隊列中,資料隊列採用先進先出的工作模式,每寫入一個資料包,系統調用在讀出線程指定的回呼函數來處理資料。選擇合適的隊列長度後,即使讀出線程沒有完成上一個資料包的讀出,寫入線程依然可以安全的寫入下一個資料,對資料隊列可以同時進行讀寫操作,線程間的資料轉送是安全可靠的。
) B X4 J2 C2 ]0 q+ g$ B9 T0 G監視控制輔助線程
1 o; |8 I! r" N, k 監視控制輔助線程的運行,是多線程協調啟動並執行另一個關鍵問題,CVI提供了CmtGetThreadPoolFunc- tionAttribute函數來監視輔助線程的狀態。在多通道、定時資料擷取的監視軟體中,多個輔助線程定時處理某項任務,直到主線程通知其停止。
( l: ?8 ]6 n- Q) s1 {CVI提供的非同步定時器機制可以方便的實現以上功能,但非同步定時器機制只能建立一個輔助線程。結合線程池機制和定時器控制項成為可行的選擇之一。CVI在建立面板的線程中調用該面板控制項的回呼函數,即要在輔助線程中運行某一定時器控制項的回呼函數,則該定時器控制項所在的面板必須在輔助線程中建立。這樣,主線程就可以通過開關該定時器來控制輔助線程開始或停止某項任務,實現多個輔助線程定時處理某項任務,且每個線程定時可以不同。
4 E9 I7 U- _ p6 T3 q8 n. K6 J7 ~5 y: H# N% y. s) q. |( _
19、如何?CVI表單的全屏?" A3 Y1 ]/ t# A n( s! X
GetMonitorFromPanel (Main, monitor);//獲得顯示器ID
V/ x. M" W' J& eGetMonitorAttribute (monitor, ATTR_HEIGHT, height);//得到高度) S, t# Z+ z+ B" H
GetMonitorAttribute (monitor, ATTR_WIDTH, width);//得到寬度
, G- A( s( Y! l. |' A6 y) GSetPanelSize (Main, height-25,width);//設定視窗高寬度 (高度需要去處工作列的部分)6 Q( f$ _% F3 L1 X, u
SetPanelPos (Main, 25, 0);//設定視窗位置2 o8 P i B. [+ C5 e2 l$ S9 [" R
+ c9 M" L; M0 T- R, w但仍會看到狀態列,像遊戲一樣的全屏還沒想到。希望網頁跟貼解決哦。) u0 _7 _; K9 U4 M. E- o. d
* u g! m8 N. b. ~, k
以解決 n7 y% H" m. V ^) o& p5 w
DisableTaskSwitching();
- F! g l# l/ ]3 GSetPanelAttribute (handle, ATTR_CAN_MINIMIZE, FALSE);( N/ k$ M' u( ?/ G8 w+ m3 o
SetPanelAttribute (handle, ATTR_CAN_MAXIMIZE, FALSE);6 q; X% e1 z3 _1 v E G. B5 m0 {
SetPanelAttribute (handle, ATTR_CLOSE_ITEM_VISIBLE, FALSE);$ }! [. p4 T$ a0 e1 b. x
SetPanelAttribute (handle, ATTR_MOVABLE, FALSE);
" v# f- {) t! x8 b! L9 O; aSetPanelAttribute (handle, ATTR_SIZABLE, FALSE);
3 F- x2 e: s3 // @5 f$ pSetPanelAttribute (handle, ATTR_SYSTEM_MENU_VISIBLE, FALSE);" B/ /, L7 T* g" P7 ^6 L9 K z( H+ U
SetCtrlAttribute (handle, PANEL_NORMAL_TEXT, ATTR_VISIBLE, FALSE);
, P# E" l' [# l' t9 GSetCtrlAttribute (handle, PANEL_LOCKOUT_TEXT, ATTR_VISIBLE, TRUE);
% /# H; r1 ?* Q Q, X( gSetPanelAttribute (handle, ATTR_WINDOW_ZOOM, VAL_MAXIMIZE);
- q# U" }! h x8 ~( j. m" U) V+ K1 v V+ M& b0 n
! n7 V6 i7 L2 {' I7 P20、如何在LABWINDOWS中調用MATLAB程式?
$ /" Q- R3 D' L+ B+ XCVI和Matlab混合編程,必須要先安裝Matlab
% Q' F, f3 _/ q# f: u0 O. B在CVI中,建立ActiveX控制項伺服器,選擇Matlab Automatin Server Type Library.(Matlab必須在CVI之前安裝才能看到這個選項),建立後將產生三個檔案,XXX.fp XXX。C和XXX.h,將。C和。H檔案包含在CVI工程中就可以了。。C檔案中包含著CVi和Matlab的介面函數。
3 y( }2 @5 |7 V" i5 C7 K其中就包括開啟Matlab函數,運行Matlab函數等。* B# u/ L8 B1 h! y# f8 q
- A/ q: d9 r1 ?0 w) I3 d
21、如何在CVI中播放Flash影片?6 Y" G9 ?8 }0 f8 b3 C' r0 N7 w
需要先安裝好FLASH PLAYER的IE外掛程式。
7 J. X- K @' t0 @ b# n實現方法:主要是通過調用ActiveX控制項的方式進行。需要在panel上建立一個ActiveX 容器。8 W, C: q) B; y/ ^* /+ H
第一步:獲得ActiveX控制項控制代碼;
/ s! o% L8 J" S1 f, q8 C/ q; b0 {' aerrorCode = MD_NO_ERROR;7 S8 U6 H! e# v2 R2 m _6 `
errorCode = GetObjHandleFromActiveXCtrl (panel, control, movie); L! E3 f6 x4 m% b0 }' |
if(errorCode != 0)* m K4 L& Z$ ~7 }6 F& d* Y: /
goto error;) P3 d0 T1 R+ A* H3 x+ ^- Y) ^
第二步:設定播放檔案路徑;6 t$ R! u; m/ O. P6 _, ~: }
errorCode = ShockwaveFlashObjects_IShockwaveFlashSetMovie(*movie, NULL, path);$ m1 h; e8 S0 H8 L. ?8 a5 M3 _
if(errorCode < 0)
7 P% @0 Z, h/ i6 ~0 ^, P- @ goto error;
J) i& ^$ d. ]7 B9 ^% F第三步:開始播放檔案% g0 W9 u! ~' W) N' K, R
errorCode = ShockwaveFlashObjects_IShockwaveFlashPlay (*movie, NULL);
S' I0 y R* c# X if(errorCode < 0)4 W; Y; v5 f7 x' K r+ E: d
goto error;; H7 {$ X3 S. t* V0 ~% L$ u
第四步:關閉開啟的物件控點;: R0 `. `, i) g) ~! E
errorCode = CA_DiscardObjHandle (movie); $ b" ^( ]% F% V$ R( @ o7 B, ?
$ S+ K1 t$ X7 i" H
22、如何動態調用DLL?! P4 b7 H( |8 Z5 y# J: L$ |
#include <windows.h>
4 o* K# S% j* Q6 P' M' v6 U) D1 [5 ~#include <ansi_c.h>+ M. }4 L4 s' `. {% J* @
#include <utility.h>: R) ]7 h( R$ ?
#include <cvirte.h>) ? ~" D7 E( u$ M. c
根據函數申明進行定義
3 `4 m6 Z2 Q, @, k O6 @typedef int(*lpaddfun)(char[], char[]);
; `. C# x7 H) C3 ?( C, W- K
. z; U) E4 b s) w4 iint main (int argc, char *argv[])
( u b: ~0 b( S, ]{ p$ g+ Q9 G; q3 R- H( {7 |- E
void *handle=0;$ R$ i+ @: L! s. b9 u; W
char str1[100],str2[100];
) `! }6 [; M# q( I lpaddfun DISKID32; g; f+ /6 v% i4 V3 d6 D6 r
HMODULE DLLhandle;
! j) J! B9 B! w2 X+ |) {6 `7 T if (InitCVIRTE (0, argv, 0) == 0)6 {3 X8 f9 o. j3 _( B* Y2 P D" v4 [# ^
return -1; /* out of memory */) X2 Q3 X1 x$ a x5 H
E- i6 `, X; H# r9 U0 Z2 a4 X; S
DLLhandle = LoadLibrary ("d://Customer//diskid32v2.00//DiskID32.dll"); 5 j" X0 W7 w3 A; Q! Y$ ^
DISKID32 = (lpaddfun)GetProcAddress (DLLhandle,"DiskID32");
5 Y/ h3 i# O8 D, F6 J( q/ S0 E, h. E- U: X/ p' F6 M
//執行函數
% w) Q6 U I! p8 b: w' k8 s3 /5 N F2 U+ h. X9 i9 V
釋放DLL - W; u; ^4 ]8 k" K0 ~7 {
FreeLibrary(DLLhandle);
8 u4 j/ X; ^# U0 t}8 O# O- g- |6 G
, B+ o- G" N3 r1 i m23、CVI編譯器設定參數的意思?
" |/ A$ X- s8 ` Ubuild options菜單Default calling convention選項中,有兩個選項,一個是"cdecl",另一個是"stdcall",
/ i4 /) F {$ y4 [7 E( |StdCall pascal cdecl 區別:參數傳入Stack的順序有所不同 g! S) g9 g/ |- v4 z
8 h T/ |; Q: ]4 E0 @4 C( ]9 T
Directive Parameter order Clean-up Passes parameters in registers?" J2 w- J+ F8 }" @. F. h" x
register Left-to-right Routine Yes+ O$ k. k8 T2 f" Z U H
pascal Left-to-right Routine No4 /3 p) c ^3 f& S8 A: e
cdecl Right-to-left Caller No
6 Q/ |5 M) l( s6 Wstdcall Right-to-left Routine No
- x" y7 M6 O% isafecall Right-to-left Routine No
% /6 J5 T9 Z R4 P X! I) f+ u+ |- n) m
_stdcall將參數壓棧是按C語言的順序(從右至左),但與C 語言不同的是它是由被調用者將參數從棧中清除的,所以它的編譯檔案比_cdecl小。_stdcall是Windows API函數中預設的呼叫慣例,VB、VFP等也採用這個約定。
! h$ ~* N: ?! K0 ` _cdecl是C語言採用的預設調用方法,它的優點是支援printf這樣的可變參數調用。 0 @ e# g# [0 T+ z4 q* {3 M- X
另外,VC++對於兩種調用方法的名稱轉換方法也不同。
5 L* F4 ? u2 q' z' B: d; ^8 h+ _
- _; p" G% p+ X0 e24.如何通過編程來建立捷徑% ^; b4 D8 U( x1 v
初次接觸這個問題,經過查詢得知:API提供了一個COM介面調用, IShellLink 將允許你建立一個捷徑,要在案頭建立一個捷徑,只要把這個捷徑儲存到案頭目錄就可以了。可是這需要瞭解這個COM介面的調用方法,以及一些API的使用問題,如CreateShortCut,很繁瑣,一個小時下來也沒有結果。9 c% f# n; G; J* S/ x
我放棄了上面的想法,開始研究案頭捷徑,通過對批處理建立的捷徑的研究,發現當你在案頭建立一個對應的 .url 的檔案即可,windows會將其解析為捷徑。
g6 V* S: d$ `* _假設你的目標程式為 D:/IDEasm.exe,下面為其建立案頭捷徑。, K; H5 k% S, F% o) V [% ?* f& U
l! I. I. Y3 b/ H對應的 IDEasm.url 檔案內容及格式如下,(符號 // 後為注釋部分,不在檔案中) [. D8 p4 e" f1 a ]
---------------------------------------------
3 b8 U: `' H* h+ n% Y$ U[InternetShortcut] //標誌
" c; w6 B7 T$ |$ V0 E- s, m" EURL=D:/IDEasm.exe //目標程式全路徑檔案名稱8 D4 I6 e. X9 f, x( U6 {+ X
IconFile=D:/IDEasm.exe //以下設定IDEasm.url檔案的表徵圖
- Q( f" O0 w0 j) ZIconIndex=0 + ~* K, Y7 c# | i1 g7 s
---------------------------------------------
( [: I' H" V# } u E寫完後儲存,此檔案會自動被系統解析成捷徑的樣子。將上面的檔案儲存在案頭後,就相當於在案頭建立了捷徑。) /2 H2 e; j: ~% i. j: p: R
這樣我們只要在程式中用 CreateFile 建立這個 .url 檔案就行了,唯一需要改動的只是目標程式的全路徑檔案名稱(這可以由程式本身獲得)。
. @; g: ?/ }: A7 }/ h) C" s5 p
( f# [, y, b% k- f- Y 1、判斷系統硬碟,可以通過 GetWindowsDirectory 來提取。比如 C:/
) r; _0 w! _) O) }. c# ]8 } 2、由上面的結果拼接出案頭的全路徑名 'C:/' + 'Documents and Settings/All Users/案頭'9 b. [5 c, t5 I5 `3 v. o9 V |
綜上,在得到案頭的全路徑名後,再拼接出我們要建立的 .url檔案的全路徑檔案名稱即可。最後用 CreateFile 來建立這個檔案 (即:C:/Documents and Settings/All Users/案頭/IDEasm.url ),再用WriteFile將上面虛線框中的內容寫入此檔案即可.
. ~8 ]+ `2 { O1 S. p' Y- f- W
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/CHUKAIHUA/archive/2010/05/11/5573821.aspx