锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
1 銆?/span> linux 瀹夎濂藉悗宸茬粡瑁呭ソ浜?/span> cvs 錛屽彲鐢?/span> rpm -qa|grep cvs 鏌ョ湅銆?/span>
濡傛灉娌℃湁瀹夎浣犲彲浠ュ湪 Redhat 絎?/span> 2 寮犲厜鐩樹笂鎵懼埌錛屽彟澶栦綘涔熷彲浠ュ湪緗戜笂涓嬭澆鍒版渶鏂扮殑 rpm 鍖呫傚緢瀹規槗鎵撅紝鍏跺疄涓嶅瓨鍦ㄤ粈涔?/span> linux 鐗堟湰銆?/span>
2 銆佸垱寤?/span> cvs 浣跨敤鐨勭洰褰曪細 mkdir /home/mycvstest
3 銆佸垱寤?/span> cvs 浣跨敤鐨勭敤鎴峰拰緇?/span>
groupadd cvs
useradd -g cvs -G cvs 鈥揹 /home/mycvstest cvs
passwd cvs
4 銆佷慨鏀?/span> mycvstest 鐨勭敤鎴鳳細 chown -R cvs:cvs /home/mycvstest
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 chmod 755 /home/mycvstest
5 銆佸垏鎹㈢敤鎴鳳細 su cvs
6 銆佸垱寤烘簮鐮佷粨搴擄細 mkdir /home/mycvstest/drcls drclgw
7 銆佸垵濮嬪寲婧愮爜浠撳簱錛?/span> cvs -d /home/mycvstest/drcls init
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 cvs -d /home/mycvstest/drclgw init
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽聽聽chmod 755 /home/mycvstest/drcls drclgw
鍒濆鍖栧悗鍙互鍦ㄧ洰褰曚笅瑙佸埌鏂板鍔犵殑
CVSROOT
鐩綍錛?/span>
cvs
鎵鏈夌殑鎺у埗淇℃伅閮藉湪榪欎釜鐩綍閲屻?/span>
8 銆侀鍥炲埌 root 鐢ㄦ埛錛屽緩绔?/span> CVS 鏈嶅姟鍚姩鏂囦歡錛?/span> CVS 浣跨敤 xinetd 鏂瑰紡鍚姩銆?/span> 聽
vi /etc/xinetd.d/cvspserver
service cvspserver
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
server= /usr/bin/cvs
server_args= -f --allow-root=/home/mycvstest/drcls
--allow-root=/home/mycvstest/drclgw pserver
log_on_failure += USERID
}
娉細綰㈣壊鐨勫弬鏁板緢閲嶈錛岀敱浜?/span> xinetd 鐨?/span> server_args 闀垮害闄愬埗 , 褰撲綘鎯寵繍琛屽緢澶氱殑鍗曚釜浠撳簱鐨勬椂鍊?/span> ( 灝辨槸鏈夊緢澶氫釜妯″潡鏃訛紝姣斿 drcrgw), 浣嗗湪 server_args 涓棤娉曡緭鍏ヨ繖涔堝鍗曚釜鐨勪粨搴擄紝 鍙互閲囧彇浠ヤ笅鏂瑰紡瑙e喅錛堢幇鍦ㄥ疄楠屽 90 涓婂氨鐢ㄧ殑榪欑鏂瑰紡錛夛細
#> vi cvspserver
service cvspserver
{
聽聽聽聽聽聽聽 disable = no
聽聽聽聽聽聽聽 socket_type = stream
聽聽聽聽聽聽聽 wait = no
聽聽聽聽聽聽聽 user = root
聽聽聽聽聽聽聽 server = /usr/bin/cvs.run
聽聽聽聽聽聽聽 server_args =""
}
緙栧啓 cvs.run 鑴氭湰
vi /cvsroot/cvs.run
#!/bin/bash
/usr/bin/cvs -f
--allow-root=/home/mycvstest/drcls
--allow-root= /home/mycvstest/drclgw
pserver
chmod a+x cvs.run
9 銆佸姞鍏?/span> cvs 鏈嶅姟錛?/span>
#>vi /etc/services
cvspserver 2401/tcp #pserver cvs service
cvspserver 2401/udp #pserver cvs service
10 銆佸惎鍔?/span> cvs 鏈嶅姟錛?/span>
#> service xinetd restart
11 銆佹鏌?/span> cvspserver 鏈嶅姟鏄惁宸茬粡鍚姩錛?/span>
#> netstat -l |grep cvspserver
搴旇鏈夊涓嬬粨鏋滐細
tcp 0 0 *:cvspserver *:* LISTEN
聽
浜屻佷嬌鐢ㄥ拰綆$悊
1 銆佸垱寤?/span> cvs 鐢ㄦ埛錛?/span>
cd /home/mycvstest/drcls/CVSROOT
htpasswd 鈥揷 passwd zhangcan (htpasswd
鍛戒護瑕佸畨瑁?/span>
apache
鍚庢墠鏈夛紝姝ゅ懡浠ゅ垱寤轟竴涓?/span>
passwd
鏂囦歡錛岄噷闈㈠唴瀹逛負鏂板緩
cvs
鐢ㄦ埛鐨勭敤鎴峰悕鍜屽瘑鐮?/span>
)
vi passwd ( 鍦ㄦ柊寤虹殑鐢ㄦ埛鍚庢墜宸ュ姞鍏ョ敤鎴峰睘浜庣殑緇?/span> cvs)
渚嬪錛?/span>
zhangcan:dgeagasdgasdr:cvs聽
钃濊壊瀛楃涓茶〃紺哄姞瀵嗗悗鐨勫瘑鐮併?/span>
2
銆佽祴浜堢敤鎴瘋鍐欐潈闄?/span>
鎵嬪伐鍦?/span> CVSROOT 鐩綍涓緩绔?/span> readers 鍜?/span> writers 鏂囦歡銆?/span> Readers 鏂囦歡涓殑鐢ㄦ埛鍙湁璇繪潈闄愶紝 writers 涓殑鐢ㄦ埛鍏鋒湁璇誨啓鏉冮檺錛屼竴琛屽彧鍐欎竴涓敤鎴峰悕銆?/span>
3 銆佺櫥褰?/span> cvs
鍦ㄥ鎴鋒満 Linux 涓嬮潰鐢ㄥ懡浠わ細
export CVSROOT=:pserver:zhangcan@192.168.100.197:/home/mycvstest/drcls
cvs login
4 銆佸悜婧愮爜浠撳簱涓鍏ユ簮鐮?/span>
棣栧厛榪涘叆浣犳湰鏈轟笂瀹夎婧愮爜鐨勭洰褰曪紝鐒跺悗浣跨敤浠ヤ笅鍛戒護錛?/span>
cvs import 鈥搈 鈥渢his is my soure code鈥?drcls NISEC test start
-m 琛ㄧず鍦?/span> cvs 鍘嗗彶鏂囦歡鏄劇ず鐨勬秷鎭紝 drclst 涓轟綘鎸囧畾鐨勬簮鐮佺洰褰曞悕錛?/span> NISEC 涓轟緵搴斿晢鏍囩錛?/span> test 涓哄彂琛屾爣絳撅紙榪欎袱欏瑰彲浠ヤ笉瑕侊級錛?/span> start 蹇呴』瑕併?/span>
5 銆?/span> checkout 鍑洪渶瑕佷慨鏀圭殑婧愪唬鐮?/span>
cvs co drcls聽 鍦ㄤ綘鐨勫綋鍓嶇洰褰曚笅浼氬彂鐜板浜嗕竴涓?/span> drcls 鐩綍錛岃淇敼鐨勬簮鐮侀兘鍦ㄩ噷闈?/span>
co
涓?/span>
checkout
鐨勭畝鍐?/span>
6 銆佹彁浜や慨鏀?/span>
鍋囪鍒氭墠瀵?/span> readme 鏂囦歡榪涜浜嗕慨鏀癸紝鐜板湪鎻愪氦
cvs commit 鈥搈 鈥渕odify a few of wrong words鈥?span style="mso-spacerun: yes">聽 readme
鍛戒護鎵ц鍚庝細鎻愮ず鐗堟湰宸茬粡鏀逛負 1.2 銆?/span>
7 銆?/span> checkout 鍑轟互鍓嶇殑鐗堟湰
濡傛灉鎯蟲鍑轟互鍓嶇殑鐗堟湰鍙互鐢ㄤ互涓嬪懡浠わ細
cvs co 鈥搑 1.1 drcls/readme 鎴栬?/span> cvs 鈥揇 yesterday drcls/readme
8 銆佸垹闄ゆ枃浠?/span>
鑻ユ兂浠庢簮鐮佷粨搴撲腑鍒犻櫎 readme 鏂囦歡錛岄鍏堝簲鎶婂鎴鋒満宸ヤ綔鐩綍涓殑 readme 鏂囦歡鍒犻櫎錛岀劧鍚庝嬌鐢?/span> cvs 鐨勫垹闄ゅ懡浠わ紝鏈鍚庢彁浜ゅ垹闄わ紝嫻佺▼濡備笅錛?/span>
rm readme
cvs rm readme
cvs commit 鈥搈 鈥?/span> 鐜板湪涓嶉渶瑕佽繖涓?/span> readme 鏂囦歡 鈥?span style="mso-spacerun: yes">聽 readme
濡傛灉緋葷粺綾諱技閿欒錛?/span> cannot remove file `INSTALL' which has a numeric sticky tag of `1.1'
鍙互鐢ㄥ懡浠?/span>
cvs update 鈥揂 readme
鍚庡啀鍒犻櫎鏂囦歡銆?/span>
浠ヤ笂涓虹伀灞卞摜鎻愪緵鐨?浠ヤ笅鏄垜娣誨姞鐨勯儴浠?
1.鍦╮eader鍜寃rites鏂囦歡涓坊鍔犱嬌鐢ㄧ敤鎴鋒椂瑕佹敞鎰?褰撳湪reader涓坊鍔犱簡鏌愪竴鍙鐢ㄦ埛鍚庡氨涓嶈鍦╳riters涓坊鍔犳鐢ㄦ埛,濡傛灉鍦ㄤ袱涓枃浠朵腑閮芥坊鍔犲悓涓鐢ㄦ埛鐨勮瘽,鍦ㄤ嬌鐢╟vs鏃?CVS鏈嶅姟鍣ㄤ細鎶婃鐢ㄦ埛褰撳仛鍙鐢ㄦ埛鐪嬪緟,褰撲嬌鐢ㄤ竴浜涘懡浠ゅimport鏃朵細浜х敓鏉冮檺闂,浠ヤ笅鏄痩inux鍏充簬姝ら棶棰樼殑璇存槑:
/* This command has the potential to modify the repository, so
聽 聽* we check if the user have permission to do that.
聽 聽*
聽 聽* (Only relevant for remote users -- local users can do
聽 聽* whatever normal Unix file permissions allow them to do.)
聽 聽*
聽 聽* The decision method:
聽 聽*
聽 聽*聽 聽 If $CVSROOT/CVSADMROOT_READERS exists and user is listed
聽 聽*聽 聽 in it, then read-only access for user.
聽 聽*
聽 聽*聽 聽 Or if $CVSROOT/CVSADMROOT_WRITERS exists and user NOT
聽 聽*聽 聽 listed in it, then also read-only access for user.
聽 聽*
聽 聽*聽 聽 Else read-write access for user.
聽 聽*/
娉?涔辯爜鏄敱浜庢垜鐨凩INUX涓嬩笉鏀寔涓枃鍝?鏄敞閲婁笉鐢ㄧ瀹?br />Demo.cpp:浠g爜濡備笅:
#include <string.h>
#include <iostream>
#include "Demo.h"
int main( int argc , char* argv[])
{
聽MemoryInf mymem;
聽DiskInf mydisk;
聽DbInf mydb;
聽Inital( argv[1]);
聽mydisk = GetDiskStat();
聽mymem = GetMemInf();
聽mydb = GetDbStat();
聽printf("disk total space:%d\n",mydisk.TotalSpace);
聽printf("disk FreeSpace space:%d\n",mydisk.FreeSpace);
聽printf("Memory TotalMem:%d\n",mymem.TotalMem);
聽printf("ValidMem:%d\n",mymem.ValidMem);
聽printf("VirtualMem:%d\n",mymem.VirtualMem);
聽printf("DbConnNum:%d\n",mydb.DbConnNum);
聽printf("DbStat:%d\n",mydb.DbStat);
聽printf("cpu:%d\n",GetCpuInf());
聽DesIceCom();
聽return 1;
}
5.緙栬瘧鏂囦歡鐢熸垚鍙墽琛岀▼搴?
鐢ㄤ互涓嬪懡浠?
$c++聽-lMyApp聽-o聽Demo聽Demo.cpp
璇存槑:-lMyApp鍙傛暟琛ㄧず,鐢ㄥ姩鎬侀摼鎺ュ簱libMyApp.so涓璧瘋繘琛岀紪璇?瀵逛簡libMyApp.so鏈濂芥斁鍦?usr/lib鐩綍涓嬪搱
濡備笉鍑烘剰澶栧垰浼氱敓鎴愬悕涓篋emo鐨勫彲鎵ц鏂囦歡
#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
//ICE棰勭紪璇戣鍙?/p>
#ifdef _DEBUG
#pragma comment(lib, "iced.lib")
#pragma comment(lib, "iceutild.lib")
#else
#pragma comment(lib, "ice.lib")
#pragma comment(lib, "iceutil.lib")
#endif
typedef struct
{
聽聽聽 DWORD聽聽 dwUnknown1;
聽聽聽 ULONG聽聽 uKeMaximumIncrement;
聽聽聽 ULONG聽聽 uPageSize;
聽聽聽 ULONG聽聽 uMmNumberOfPhysicalPages;
聽聽聽 ULONG聽聽 uMmLowestPhysicalPage;
聽聽聽 ULONG聽聽 uMmHighestPhysicalPage;
聽聽聽 ULONG聽聽 uAllocationGranularity;
聽聽聽 PVOID聽聽 pLowestUserAddress;
聽聽聽 PVOID聽聽 pMmHighestUserAddress;
聽聽聽 ULONG聽聽 uKeActiveProcessors;
聽聽聽 BYTE聽聽聽 bKeNumberProcessors;
聽聽聽 BYTE聽聽聽 bUnknown2;
聽聽聽 WORD聽聽聽 wUnknown3;
} SYSTEM_BASIC_INFORMATION;
typedef struct
{
聽聽聽 LARGE_INTEGER聽聽 liIdleTime;
聽聽聽 DWORD聽聽聽聽聽聽聽聽聽聽 dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;
typedef struct
{
聽聽聽 LARGE_INTEGER liKeBootTime;
聽聽聽 LARGE_INTEGER liKeSystemTime;
聽聽聽 LARGE_INTEGER liExpTimeZoneBias;
聽聽聽 ULONG聽聽聽聽聽聽聽聽 uCurrentTimeZoneId;
聽聽聽 DWORD聽聽聽聽聽聽聽聽 dwReserved;
} SYSTEM_TIME_INFORMATION;
// ntdll!NtQuerySystemInformation (NT specific!)
//
// The function copies the system information of the
// specified type into a buffer
//
// NTSYSAPI
// NTSTATUS
// NTAPI
// NtQuerySystemInformation(
//聽聽聽 IN UINT SystemInformationClass,聽聽聽 // information type
//聽聽聽 OUT PVOID SystemInformation,聽聽聽聽聽聽 // pointer to buffer
//聽聽聽 IN ULONG SystemInformationLength,聽 // buffer size in bytes
//聽聽聽 OUT PULONG ReturnLength OPTIONAL聽聽 // pointer to a 32-bit
//聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // variable that receives
//聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // the number of bytes
//聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 // written to the buffer
// );
typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSI NtQuerySystemInformation;
/*
聽 鍔熻兘:寰楀埌CPU浣跨敤鐘舵?br />聽 鍙傛暟:鏃?br />聽 榪斿洖鍊?鍐呭瓨鍗犵敤鐜?br />聽 浣滆?鐗電墰鏁f
*/
int GetCpuStat()
{
聽SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
聽聽聽 SYSTEM_TIME_INFORMATION聽聽聽聽聽聽聽 SysTimeInfo;
聽聽聽 SYSTEM_BASIC_INFORMATION聽聽聽聽聽聽 SysBaseInfo;
聽聽聽 double聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime;
聽聽聽 double聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 dbSystemTime;
聽聽聽 LONG聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 status;
聽聽聽 LARGE_INTEGER聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 liOldIdleTime = {0,0};
聽聽聽 LARGE_INTEGER聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 liOldSystemTime = {0,0};
聽int UsageCpu = 0;
聽聽聽 NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
聽聽GetModuleHandle("ntdll"),
聽聽"NtQuerySystemInformation"
聽聽);
聽
聽聽聽 if (!NtQuerySystemInformation)
聽聽聽聽聽聽聽 return 0;
聽
聽聽聽 status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
聽聽聽 if (status != NO_ERROR)
聽聽聽聽聽聽聽 return 0;
聽聽聽聽
聽for( int t = 0 ; t < 2 ; t++ )
聽聽聽 {
聽聽status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
聽聽聽聽聽聽聽 if (status!=NO_ERROR)
聽聽聽聽聽聽聽聽聽聽聽 return 0;
聽聽
聽聽聽聽聽聽聽 status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
聽聽聽聽聽聽聽 if (status != NO_ERROR)
聽聽聽聽聽聽聽聽聽聽聽 return 0;
聽聽
聽聽if (liOldIdleTime.QuadPart != 0)
聽聽{
聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
聽聽聽聽聽聽聽聽聽聽聽 dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
聽聽聽
聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime = dbIdleTime / dbSystemTime;
聽聽聽
聽聽聽聽聽聽聽聽聽聽聽 dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;
聽聽聽UsageCpu = (int)dbIdleTime;
聽聽}
聽聽
聽聽聽聽聽聽聽 // store new CPU's idle and system time
聽聽聽聽聽聽聽 liOldIdleTime = SysPerfInfo.liIdleTime;
聽聽聽聽聽聽聽 liOldSystemTime = SysTimeInfo.liKeSystemTime;
聽聽
聽聽聽聽聽聽聽 // wait one second
聽聽聽聽聽聽聽 Sleep(500);
聽聽聽 }
聽return UsageCpu;
聽
}
/*
聽 鍔熻兘:寰楀埌鍐呭瓨浣跨敤鐘舵?br />聽 鍙傛暟:鏃?br />聽 榪斿洖鍊?鍐呭瓨淇℃伅緇撴瀯浣揫鍖呮嫭鎬葷殑鐗╃悊鍐呭瓨,榪樺彲浣跨敤鍐呭瓨,铏氭嫙鍐呭瓨,鍗曚綅涓篕]
聽 浣滆?鐗電墰鏁f
*/
MemoryInf MemorySta()
{
聽MemoryInf tmp;//鍦↖CE SLICE閲屽畾涔夌殑淇℃伅緇撴瀯浣?br />聽MEMORYSTATUS memStatus;
聽GlobalMemoryStatus(&memStatus);
聽DWORD tom=memStatus.dwTotalPhys/1024;
聽DWORD mem=memStatus.dwAvailPhys/1024;
聽DWORD res=memStatus.dwAvailVirtual/1024;
聽tmp.TotalMem = (int)tom;
聽tmp.ValidMem = (int)mem;
聽tmp.VirtualMem = (int)res;
聽return tmp;
}
/*
聽鍔熻兘:寰楀埌紜洏浣跨敤鎯呭喌
聽鍙傛暟:鏃?br />聽榪斿洖鍊?紜洏淇℃伅緇撴瀯浣?br />聽浣滆?鐗電墰鏁f
*/
DiskInf GetDiskSta()
{
聽ULARGE_INTEGER FreeAvailable,TotalNum,TotalFreeNum;
聽char p[3];
聽bool b_flag;
聽DiskInf tmp;//ICE SLICE閲屽畾涔夌殑紜洏淇℃伅緇撴瀯浣?br />聽tmp.TotalSpace = 0;
聽tmp.FreeSpace = 0;
聽//寰楀埌鏈夋晥鐨勯┍鍔ㄥ櫒鍚?鍗崇洏絎?
聽for( int drive = 1; drive <= 26; drive++ )
聽{
聽聽if( !_chdrive( drive ) )
聽聽{
聽聽聽memset( p , 0 , sizeof(p));
聽聽聽p[0] = drive + 'A' - 1;
聽聽聽p[1] = ':';
聽聽聽p[2] = '\0';
聽聽聽b_flag = GetDiskFreeSpaceEx( p ,&FreeAvailable,&TotalNum,&TotalFreeNum );
聽聽聽if( b_flag )
聽聽聽{
聽聽聽聽tmp.TotalSpace += (int)(TotalNum.QuadPart/(1024*1024));
聽聽聽聽tmp.FreeSpace += (int)(FreeAvailable.QuadPart/(1024*1024));
聽聽聽}
聽聽}
聽}
聽return tmp;
}
int main()
{
聽聽聽return 1;
}
|
鍦ㄦ墍鏈夌殑棰勫鐞嗘寚浠や腑錛?Pragma 鎸囦護鍙兘鏄渶澶嶆潅鐨勪簡錛屽畠鐨勪綔鐢ㄦ槸璁懼畾緙栬瘧鍣ㄧ殑鐘舵佹垨鑰呮槸鎸囩ず緙栬瘧鍣ㄥ畬鎴愪竴浜涚壒瀹氱殑鍔ㄤ綔銆?pragma鎸囦護瀵規瘡涓紪璇戝櫒緇欏嚭浜嗕竴涓柟娉?鍦ㄤ繚鎸佷笌C鍜孋 ++璇█瀹屽叏鍏煎鐨勬儏鍐典笅,緇欏嚭涓繪満鎴栨搷浣滅郴緇熶笓鏈夌殑鐗瑰緛銆備緷鎹畾涔?緙栬瘧鎸囩ず鏄満鍣ㄦ垨鎿嶄綔緋葷粺涓撴湁鐨?涓斿浜庢瘡涓紪璇戝櫒閮芥槸涓嶅悓鐨勩? 鍏舵牸寮忎竴鑸負: #Pragma Para 鍏朵腑Para 涓哄弬鏁幫紝涓嬮潰鏉ョ湅涓浜涘父鐢ㄧ殑鍙傛暟銆? 浼犵粺鐨勫埌鍑?DLL 鍑芥暟鐨勬柟娉曟槸浣跨敤妯″潡瀹氫箟鏂囦歡 (.def)錛孷isual C++ 鎻愪緵浜嗘洿綆媧佹柟渚跨殑鏂規硶錛岄偅灝辨槸鈥淿_declspec()鈥濆叧閿瓧鍚庨潰璺熲渄llexport鈥濓紝鍛婅瘔榪炴帴鍘昏瀵煎嚭榪欎釜鍑芥暟錛屼緥濡傦細 鎶娾淿_declspec(dllexport)鈥濇斁鍦ㄥ嚱鏁板0鏄庣殑鏈鍓嶉潰錛岃繛鎺ョ敓鎴愮殑 DLL 灝變細瀵煎嚭鍑芥暟鈥淿MyExportFunction@4鈥濄?/P>
涓婇潰鐨勫鍑哄嚱鏁扮殑鍚嶇О涔熻涓嶆槸鎴戠殑甯屾湜鐨勶紝鎴戜滑甯屾湜瀵煎嚭鐨勬槸鍘熺増鐨勨淢yExportFunction鈥濄傝繕濂斤紝VC 鎻愪緵浜嗕竴涓澶勭悊鎸囩ず絎︹?pragma鈥濇潵鎸囧畾榪炴帴閫夐」 (涓嶄粎浠呮槸榪欎竴涓姛鑳斤紝榪樻湁寰堝鎸囩ず鍔熻兘) 錛屽涓嬶細 榪欎笅灝卞ぉ濡備漢鎰夸簡錛氾級銆傚鏋滀綘鎯蟲寚瀹氬鍑虹殑欏哄簭錛屾垨鑰呭彧灝嗗嚱鏁板鍑轟負搴忓彿錛屾病鏈?Entryname錛岃繖涓澶勭悊鎸囩ず絎?(紜垏鍦拌鏄繛鎺ュ櫒) 閮借兘澶熷疄鐜幫紝鐪嬬湅 MSDN 鐨勮娉曡鏄庯細 @ordinal 鎸囧畾欏哄簭錛汵ONAME 鎸囧畾鍙皢鍑芥暟瀵煎嚭涓哄簭鍙鳳紱DATA 鍏抽敭瀛楁寚瀹氬鍑洪」涓烘暟鎹」銆?/P> |