`
touchinsert
  • 浏览: 1329620 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

实现VSS(Visual Source Safe)的Java API

阅读更多
VSS,即Visual Source Safe,是微软公司开发的Windows平台上优秀的Source版本控制器。不同于CVS的是,它不是开源,因此支持VSS的只有Windows平台。但微软发布了VSS的API。任何开发者都可以通过ssapi.dll文件,开发自定义的VSS插件或其他工具。Ssapi.dll是ActiveX组件,自然能支持多种开发语言。但想要支持Java,就得使用JNI了。
本文使用JNI实现访问VSS的Java api。
1.VSS Java API
定义VSS Java API。
package org.colimas.scm.vss;
/**
* VSS Operator class that will call native method.
* @author tyrone
*
*/
public class VSSOperator {
private static String LIBPATH="vssperator.dll";
public static String ROOT="$/";
/**
* load dll
*
*/
public VSSOperator(){
String path=Thread.currentThread().getContextClassLoader().getResource("./").getPath();
path=path+LIBPATH;
System.load(path);
}
/**
* load dll
*
*/
public VSSOperator(String libPath){
System.load(libPath);
}
/**
* Connect to VSS
* @param path srcsafe.ini file path.
* @param id user id
* @param pass password
* @return
*/
public native boolean connection(String path,String id,String pass);
/**
* disconnect from VSS
*
*/
public native void disconnection();
/**
* get current project.
* @return
*/
public native String getCurrentProject();
/**
* get database name
* @return
*/
public native String getDatabaseName();
/**
* get item names from specified path.
* @param path
* @return
*/
public native String[] getItemNames(String path);
/**
* get specified file(s) from VSS to local.
* @param itemName
* @param localPath
* @param flag
* @return
*/
public native boolean getFile(String itemName,String localPath,int flag);
/**
* get specified version of one file from VSS to local.
* @param itemName
* @param localPath
* @param version
* @param flag
* @return
*/
public native boolean getVersion(String itemName,String localPath,int version,int flag);
/**
* checkout specified file(s) from vss to local.
* @param itemName
* @param localPath
* @param comment
* @param flag
* @return
*/
public native boolean checkout(String itemName,String localPath,String comment,int flag);
/**
* check file(s) in VSS
* @param itemName
* @param localPath
* @param comment
* @param flag
* @return
*/
public native boolean checkin(String itemName,String localPath,String comment,int flag);
/**
* undo check out action
* @param itemName
* @param localPath
* @param flag
* @return
*/
public native boolean undoCheckout(String itemName,String localPath,int flag);
}
每个native方法都由VC++实现。
2.VSS的API
CodeProject网站上有一些VSS API的相关文章,本文借鉴了下面link的内容。http://www.codeproject.com/samples/SSBrowser.asp
从该网站上下载source,内有一个头文件ssauto.h是访问VSS API的关键。该文件定义了VSSAPI涉及到的所有接口,本文使用的接口有:
IVSSDatabase:VSS数据库接口。该接口负责创建连接和获得IVSSItem。
IVSSItem:VSS内的某个文件或工程,该接口负责返回文件或项目信息,Checkout,Checkin,获得文件等。
IVSSItems:VSS内某些文件或工程,IVSSItem集合。
3.Native方法实现
3.1 搭建开发环境
3.1.1.使用javah命令生成JNI的头文件。
D:\ >javah -classpath ./;D:\MyProject\colima
s\ra\SCMResources\bin\classes org.colimas.scm.vss.VSSOperator
生成一个叫org_colimas_scm_vss_VSSOperator.h的文件。
3.1.2.创建VC++的Dynamic Link Library支持MFC的工程。将org_colimas_scm_vss_VSSOperator.h文件和ssauto.h文件添加到工程内。
3.1.3.在StdAfx.h头文件加入:
#include "ssauto.h"
#include <atlbase.h>
#include <comdef.h>
extern "C" const GUID __declspec(selectany) LIBID_SourceSafeTypeLib =
{0x783cd4e0,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSSItem =
{0x783cd4e1,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSSItems =
{0x783cd4e5,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSSDatabase =
{0x783cd4e2,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) CLSID_VSSItem =
{0x783cd4e3,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) CLSID_VSSDatabase =
{0x783cd4e4,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
extern "C" const GUID __declspec(selectany) IID_IVSS =
{0x783cd4eb,0x9d54,0x11cf,{0xb8,0xee,0x00,0x60,0x8c,0xc9,0xa7,0x1f}};
//并为一些接口定义智能指针
_COM_SMARTPTR_TYPEDEF(IVSSItem, IID_IVSSItem);
_COM_SMARTPTR_TYPEDEF(IVSSItems, IID_IVSSItems);
3.1.4.在Option的Directory内加入JDK include和include\win32路径。
3.2 方法实现
在VC++源程序内加入
#include "org_colimas_scm_vss_VSSOperator.h"
并定义全局变量。
IVSSDatabase *pVdb;
IClassFactory *pClf;
3.2.1 connection方法实现
JNI定义为
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_connection
(JNIEnv *env, jobject, jstring VSSini, jstring User, jstring Password)
在注册表中查找VSS API组件
CLSIDFromProgID(L"SourceSafe", &clsid )
//实例化类工厂。
CoGetClassObject( clsid, CLSCTX_ALL, NULL,
IID_IClassFactory, (void**)&pClf )
//实例化IVSSDatabase
pClf->CreateInstance( NULL, IID_IVSSDatabase,
(void **) &pVdb )
//创建一个VSS连接。
pVdb->Open(bstrPath, bstrUName, bstrUPass)
代码如下:
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_connection
(JNIEnv *env, jobject, jstring VSSini, jstring User, jstring Password)
{
//将参数转换为C++基本类型。
const unsigned short * psz_VSSini=env->GetStringChars(VSSini, 0);
const unsigned short * psz_User=env->GetStringChars(User, 0);
const unsigned short * psz_Password=env->GetStringChars(Password, 0);
//再将这些变量转化为COM能识别的类型。
BSTR bstrPath =SysAllocString(psz_VSSini);
BSTR bstrUName = SysAllocString(psz_User);
BSTR bstrUPass = SysAllocString(psz_Password);
CLSID clsid;
jboolean result=JNI_FALSE;
CoInitialize(0);
if(S_OK == CLSIDFromProgID(L"SourceSafe", &clsid ))
{
if(S_OK == CoGetClassObject( clsid, CLSCTX_ALL, NULL,
IID_IClassFactory, (void**)&pClf ))
{
if(S_OK == pClf->CreateInstance( NULL, IID_IVSSDatabase,
(void **) &pVdb ))
{
if(S_OK == pVdb->Open(bstrPath, bstrUName, bstrUPass))
{
#ifdef _DEBUG
AfxMessageBox("Open successfully",MB_OK,0);
#endif
result=JNI_TRUE;
}else{
#ifdef _DEBUG
AfxMessageBox("Open failed",MB_OK,0);
#endif
}
}else
{
AfxMessageBox("Init failed",MB_OK,0);
}
}
}else
{
AfxMessageBox("You didnot install VSS yet",MB_OK,0);
}
//CoUninitialize();
SysFreeString(bstrPath);
SysFreeString(bstrUName);
SysFreeString(bstrUPass);
return result;
}
3.2.2 disconnectin实现
JNIEXPORT void JNICALL Java_org_colimas_scm_vss_VSSOperator_disconnection
(JNIEnv *, jobject)
{
pVdb->Release();
pClf->Release();
CoUninitialize();
#ifdef _DEBUG
AfxMessageBox("Close successfully",MB_OK,0);
#endif
}

3.2.3 getDatabaseName和getCurrentProject实现
JNIEXPORT jstring JNICALL Java_org_colimas_scm_vss_VSSOperator_getDatabaseName
(JNIEnv * env, jobject)
{
if(pVdb==NULL)
return NULL;
CComBSTR bstrDatabase;
//调用IVSSDatabase方法
if(S_OK==pVdb->get_DatabaseName(&bstrDatabase))
{
return env->NewString(bstrDatabase,bstrDatabase.Length());
}else{
#ifdef _DEBUG
AfxMessageBox("Get DB failed",MB_OK,0);
#endif
return NULL;
}
}
/*
*Get current project in vss
*/
JNIEXPORT jstring JNICALL Java_org_colimas_scm_vss_VSSOperator_getCurrentProject
(JNIEnv *env, jobject)
{
if(pVdb==NULL)
return NULL;
CComBSTR bstrProject;
//调用IVSSDatabase方法
if(S_OK==pVdb->get_CurrentProject(&bstrProject))
{
return env->NewString(bstrProject,bstrProject.Length());
}else
return NULL;
}
3.2.4 getFile实现
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_getFile
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jint flag)
{
jboolean result=JNI_FALSE;
if(pVdb==NULL)
return result;
IVSSItemPtr vssRootItem;
const unsigned short *lpath=env->GetStringChars(itemName,0);
const unsigned short *llocalPath=env->GetStringChars(localPath,0);
//获得Item实例
if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
{
//获得文件,并将文件下载到本地目录。
if(vssRootItem->Get(&CComBSTR(llocalPath),flag)==S_OK)
{
result=JNI_TRUE;
}
}
return result;
}
3.2.5 getItemNames实现
JNIEXPORT jobjectArray JNICALL Java_org_colimas_scm_vss_VSSOperator_getItemNames
(JNIEnv *env, jobject, jstring path)
{
if(pVdb==NULL)
return NULL;
jobjectArray nameArray;
IVSSItemPtr vssRootItem;
const unsigned short *lpath=env->GetStringChars(path,0);
//获得父Item。
if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
{
//获得所有子Item集合
IVSSItemsPtr vss_items;
if(vssRootItem->get_Items(_variant_t(false), &vss_items)==S_OK)
{
long l_count;
CComBSTR name;
//获得子Item个数
vss_items->get_Count(&l_count);
nameArray=env->NewObjectArray(l_count,env->FindClass("java/lang/String"),env->NewStringUTF(""));
//遍历
for (long i = 0; i < l_count; i++)
{
IVSSItemPtr vss_ChildItem;
//获得子Item
if(vss_items->get_Item(_variant_t(i+1L), &vss_ChildItem)==S_OK)
{
//获得子Item名称
vss_ChildItem->get_Name(&name);
jstring jname=env->NewString(name,name.Length());
env->SetObjectArrayElement(nameArray,i,jname);
}else
break;
}
}
}
return nameArray;
}
3.2.6 getVersion实现
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_getVersion
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jint version,jint flag)
{
jboolean result=JNI_FALSE;
if(pVdb==NULL)
return result;
IVSSItemPtr vssRootItem;
const unsigned short *lpath=env->GetStringChars(itemName,0);
const unsigned short *llocalPath=env->GetStringChars(localPath,0);
//获得Item实例
if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
{
IVSSItemPtr vss_oldItem;
//long l_version=version;
//获得该Item某个版本实例
if(vssRootItem->get_Version(_variant_t(version), &vss_oldItem)==S_OK){
//下载到本地。
if(vss_oldItem->Get(&CComBSTR(llocalPath),flag)==S_OK)
{
result=JNI_TRUE;
}
}
}
return result;
}
3.2.7 checkout实现
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_checkout
(JNIEnv *env, jobject , jstring itemName, jstring localPath, jstring comment,jint flag)
{
jboolean result=JNI_FALSE;
if(pVdb==NULL)
return result;
IVSSItemPtr vssRootItem;
const unsigned short *lpath=env->GetStringChars(itemName,0);
const unsigned short *l_localPath=env->GetStringChars(localPath,0);
const unsigned short *l_comment=env->GetStringChars(comment,0);
//获得Item实例
if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
{
//checkout到本地目录
if(vssRootItem->Checkout(CComBSTR(l_comment),CComBSTR(l_localPath),flag)==S_OK)
{
result=JNI_TRUE;
}else
AfxMessageBox("checked it out fail",MB_OK);
}
return result;
}
3.2.8 checkin实现
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_checkin
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jstring comment, jint flag)
{
jboolean result=JNI_FALSE;
if(pVdb==NULL)
return result;
IVSSItemPtr vssRootItem;
const unsigned short *lpath=env->GetStringChars(itemName,0);
const unsigned short *l_localPath=env->GetStringChars(localPath,0);
const unsigned short *l_comment=env->GetStringChars(comment,0);
//获得Item实例
if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
{
//checkin
if(vssRootItem->Checkin(CComBSTR(l_comment),CComBSTR(l_localPath),flag)==S_OK)
{
result=JNI_TRUE;
}else
{
AfxMessageBox("checked it in fail",MB_OK);
}
}
return result;
}
3.2.9 undoCheckout实现
JNIEXPORT jboolean JNICALL Java_org_colimas_scm_vss_VSSOperator_undoCheckout
(JNIEnv *env, jobject, jstring itemName, jstring localPath, jint flag)
{
jboolean result=JNI_FALSE;
if(pVdb==NULL)
return result;
IVSSItemPtr vssRootItem;
const unsigned short *lpath=env->GetStringChars(itemName,0);
const unsigned short *l_localPath=env->GetStringChars(localPath,0);
//获得Item实例
if(pVdb->get_VSSItem(CComBSTR(lpath), FALSE, &vssRootItem)==S_OK)
{
//undo
if(vssRootItem->UndoCheckout(CComBSTR(l_localPath),flag)==S_OK)
{
result=JNI_TRUE;
}else
AfxMessageBox("undochecked it out fail",MB_OK);
}
return result;
}
4.测试
VSS API用到一些Flag。我将他们定义到Java接口文件内。Flag的具体作为不做叙述。
package org.colimas.scm.vss;
/**
*@authortyrone
*
*/
publicinterface VSSFlag {
publicintVSSFLAG_USERRONO = 1;
publicintVSSFLAG_USERROYES = 2;
publicintVSSFLAG_TIMENOW = 4;
publicintVSSFLAG_TIMEMOD = 8;
publicintVSSFLAG_TIMEUPD = 12;
publicintVSSFLAG_EOLCR = 16;
publicintVSSFLAG_EOLLF = 32;
publicintVSSFLAG_EOLCRLF = 48;
publicintVSSFLAG_REPASK = 64;
publicintVSSFLAG_REPREPLACE = 128;
publicintVSSFLAG_REPSKIP = 192;
publicintVSSFLAG_REPMERGE = 256;
/**
*Specifiesafulltextcomparison.
*UsethisflagwiththeCheckin,Get,orUndoCheckoutmethodstocomparethetextcontentsofthelocalcopyandtheSourceSafemastercopy.Ifthelocalcopyisup-to-date,SourceSafedoesnotreplaceitwiththemastercopy.
*/
publicintVSSFLAG_CMPFULL = 512;
/**
*Specifiesatimestampcomparison.
*UsethisflagwiththeCheckin,Get,orUndoCheckoutmethodstocomparedate/timestampofthelocalcopyandtheSourceSafemastercopy.Ifthelocalcopyisup-to-date,SourceSafedoesnotreplaceitwiththemastercopy.
*/
publicintVSSFLAG_CMPTIME = 1024;
publicintVSSFLAG_CMPCHKSUM = 1536;
/**
*Specifiesnocomparisonmechanism.
*UsethisflagwiththeCheckin,Get,
*orUndoCheckoutmethodstoalwaysreplacethelocalcopywiththeSourceSafemastercopy.
*/
publicintVSSFLAG_CMPFAIL = 2048;
/**
*Indicatesthatacommandshouldnotberecursive(actonanentireprojecttree).Thisisthedefault.
*/
publicintVSSFLAG_RECURSNO = 4096;
/**
*Indicatesthatacommandshouldberecursive(actonanentireprojecttree).
*UsethisflagwiththeCheckin,Checkout,Get,orSharemethods.
*/
publicintVSSFLAG_RECURSYES = 8192;
/**
*Usedtooverridetheworkingfolderspecifications.
*/
publicintVSSFLAG_FORCEDIRNO = 16384;
/**
*Usedtomaintaintheworkingfoldersettings.Thisisthedefault.
*/
publicintVSSFLAG_FORCEDIRYES = 32768;
publicintVSSFLAG_KEEPNO = 65536;
publicintVSSFLAG_KEEPYES = 131072;
/**
*Indicateswhetherthelocalcopyshouldbedeleted
*afteranAdd,Checkin,orUndoCheckout.
*/
publicintVSSFLAG_DELNO = 262144;
/**
*Indicatesthatthelocalcopyofafileisdeletedwhenitischeckedin.
*/
publicintVSSFLAG_DELYES = 524288;
/**
*IndicatesthatthelocalcopyofafileisnotreplacedbyanUndoCheckoutoperation.
*Whenthisflagisset,thelocalcopyisnotreplacedwiththeSourceSafemastercopyanditsread-onlyflagissettotrue.
*/
publicintVSSFLAG_DELNOREPLACE = 786432;
/**
*IndicatesthatVisualSourceSafeauto-detectsthefiletodeterminewhetheritistextorbinary.
*/
publicintVSSFLAG_BINTEST = 1048576;
/**
*Indicatesthatafileisbinary.
* Whenthisflagisset,SourceSafesetstheaddedfiletypetobinary.
*/
publicintVSSFLAG_BINBINARY = 2097152;
/**
*Indicatesthatafileistext.
*/
publicintVSSFLAG_BINTEXT = 3145728;
/**
*Indicatesthatanaddedfileretainsitshistoricalversions.
*/
publicintVSSFLAG_DELTAYES = 4194304;
/**
*Indicatesthatanaddedfiledoesnotretainitshistoricalversions.
*/
publicintVSSFLAG_DELTANO = 8388608;
publicintVSSFLAG_UPDASK = 16777216;
publicintVSSFLAG_UPDUPDATE = 33554432;
publicintVSSFLAG_UPDUNCH = 50331648;
/**
*IndicatesthatthelocalcopyshouldbereplacedwiththeSourceSafemastercopyoncommandsthatdoanautomaticGet.
*/
publicintVSSFLAG_GETYES = 67108864;
/**
*IndicatesthatthelocalcopyshouldnotbereplacedwiththeSourceSafemastercopyoncommandsthatdoanautomaticGet.
*/
publicintVSSFLAG_GETNO = 134217728;
/**
*Indicatesthatacheckoutisexclusive.
*SourceSafeallowsthefilestobecheckedoutbymorethanoneuser.

相关推荐

    Visual Source Safe 2005

    Visual Source Safe 2005 很好的项目管理工具!

    Microsoft Visual Source Safe 2005(VSS安装包)

    Microsoft Visual Source Safe 2005(VSS安装包),Microsoft Visual Source Safe 2005(VSS安装包),Microsoft Visual Source Safe 2005(VSS安装包)

    VSS Visual Source Safe

    **Visual SourceSafe (VSS)** 是微软开发的一款版本控制系统,主要面向软件开发团队,用于管理代码和其他项目资源的版本和变更历史。它被集成在**Microsoft Visual Studio** 的环境中,提供了一种方便的方式来跟踪和...

    Visual Source Safe 6.0 server

    Visual Source Safe Server 6.0,注册码连续输1,直到不能再输入。由于附件太大,分成6个压缩文件,需要全部下载方可使用。配套的还有Visual Source Safe 6.0 client

    VSS (Visual Source Safe 2005) 用法详解

    【VSS (Visual Source Safe 2005) 用法详解】 VSS,全称为Visual Source Safe 2005,是一款由微软开发的版本控制系统,主要用于管理和追踪软件开发中的源代码更改。以下是VSS的基本操作和配置步骤: 1. **安装...

    好用的Visual Source Safe6.0 客户端及安装与配置说明

    Visual SourceSafe 6.0(简称VSS)是由Microsoft开发的一款源代码版本控制系统,它主要用于管理软件项目的源代码和其他文件,使得多人协作开发时能够有效跟踪和控制代码变更。本篇将详细介绍VSS 6.0客户端的安装、...

    源代码版本控制器VSS支持VS2010补丁(Visual Source Safe )

    VS2010默认的源代码版本控制器是TFS,个人还是喜欢VSS。源代码版本控制器VSS支持VS2010补丁(Visual Source Safe),在VSS2005上升级即可支持Visual studio 2010。

    VSS.rar_Visual Source Safe_nutshell

    《Visual Source Safe in Nutshell》是由Ajay Kumar所著,Animon Software Solution公司出版的一本关于Microsoft Visual Source Safe(VSS)的详细指南。这本书旨在为开发者和项目团队提供一个全面且实用的VSS使用...

    VSS (Visual Source Safe 2005) 用法

    根据给定的文件信息,以下是对VSS(Visual Source Safe 2005)用法的详细解析: ### VSS(Visual Source Safe 2005)简介与安装 VSS,全称Visual Source Safe 2005,是微软推出的一款版本控制软件,主要用于管理...

    Visual Source Safe

    Visual Source Safe(VSS)是由Microsoft开发的一款源代码版本控制系统,广泛应用于软件开发领域,尤其在JAVA代码版本管理中表现出色。作为一款强大的版本控制工具,VSS对于团队协作、代码管理和项目追踪提供了全面...

    使用两个不同的源代码控制程序:Microsoft Visual Source Safe 和Rational ClearCase

    本文将深入探讨两种常用的源代码控制程序:Microsoft Visual SourceSafe(VSS)和Rational ClearCase。 Visual SourceSafe,简称VSS,是由微软开发的一款版本控制系统。它主要面向小型团队,提供了基本的版本控制...

    Visual Source Safe使用手册

    《Visual Source Safe使用手册》是一本详细介绍微软的Visual SourceSafe(VSS)6.0的指南,主要关注软件版本管理和项目协作。随着软件行业的快速发展,软件版本管理的重要性日益凸显,尤其是在团队协作的环境下,...

    vss(Visual source safe)

    Visual SourceSafe(VSS)是由Microsoft开发的一款源代码版本控制系统,它主要用于管理和跟踪软件开发过程中的源代码变更。VSS6.0是该系统的一个较早版本,虽然随着时间的推移,新的版本如Visual Studio Team ...

    visual source safe 8.0

    Visual SourceSafe 8.0(简称VSS)是由微软公司开发的一款版本控制系统,主要用于管理和跟踪软件项目的源代码变更。在IT行业中,版本控制是至关重要的,它帮助开发者追踪和管理代码的不同版本,协同工作,避免冲突,...

    visual source safe scc文件删除工具

    删除工程目录中的所有scc文件。可以取消vc打开时的关联vss

    Visual Source Safe6

    Visual Source Safe 6(VSS6)是Microsoft开发的一款源代码版本控制系统,它是Visual Studio家族的重要组成部分,专为软件开发团队提供项目文件的管理和协作功能。VSS6的核心价值在于帮助开发者追踪代码变更,管理...

    Visual Source Safe操作手册

    **Visual Source Safe (VSS) 操作手册** **1. VSS 概述** 1.1 VSS 简述 Visual SourceSafe (VSS) 是由微软公司开发的一款源代码版本控制系统,专为小型团队协作开发设计。它提供了一种有效的方式来管理和追踪软件...

    Visual Source Safe(VSS)使用介绍

    ### Visual Source Safe (VSS) 使用介绍 #### VSS6.0简介 **Visual Source Safe (VSS)** 是一款由微软公司开发的版本控制系统,它主要用于管理软件开发过程中的源代码和其他相关文件。随着软件开发项目的复杂度...

    Visual Source Safe(Vss)2005帮助文档

    《Visual Source Safe (VSS) 2005 帮助文档综合解析》 Visual Source Safe (VSS) 2005 是一款由微软公司推出的版本控制系统,专为软件开发团队提供源代码管理解决方案。它允许团队成员在共享项目中协同工作,同时...

Global site tag (gtag.js) - Google Analytics