📄 extendmain.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <winbase.h>
#include <srv.h>
#include "head.h"
#pragma link "opends60.lib"
#pragma link "memmgr.lib"
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------
#ifdef __cplusplus
extern "C" {
#endif
//---------------------------------------------------------------------------
// MSSQL 2000 存储过程必须有的函数
//---------------------------------------------------------------------------
__declspec(dllexport) ULONG WINAPI __GetXpVersion()
{
return ODS_VERSION;
}
//---------------------------------------------------------------------------
// DLL 文件的主程序
//EXEC sp_addextendedproc 'FileCopy', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'FileDelete', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'RDDIR', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'ServerStat', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'MKDIR', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'LockPc', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'MKDIR', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'StartPorg', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'KillPorg', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'GetIP', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//EXEC sp_addextendedproc 'TextPart', 'F:\耿海瑞资料\c++ builder源文件\W2k 扩展存储过程\ExtEnd.dll'
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//对目录的建立.
__declspec(dllexport) SRVRETCODE WINAPI MKDIR(SRV_PROC* pSrvProc)
{
int nArgs = srv_rpcparams(pSrvProc);
if(nArgs<0){
//如果没有参数则通报正确的使用方法
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0, (DBUSMALLINT) __LINE__, "调用: EXEC MKDIR <路径> [返回值 OUTPUT]", SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
char *szHash; //返回值
char Sfile[MAX_PATH+1]; //路径
BYTE bType; //获取类型
bool ExtMkDir=false;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
//获取第一参数
if(nArgs>0)
{
srv_paraminfo(pSrvProc,1,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ZeroMemory(Sfile,MAX_PATH+1);
memcpy(Sfile,srv_paramdata(pSrvProc, 1),cbActualLen);
}
if(nArgs>1)
{
srv_paraminfo(pSrvProc,2,NULL,NULL,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ExtMkDir=(bool)(*(int *)srv_paramdata(pSrvProc, 2));
}
if (ExtMkDir)
MakeDirectoryEx(Sfile);
else
CreateDir(Sfile);
DirExist(Sfile)?szHash="1":szHash="0";
if (nArgs > 2) //如果有设置的返回值的保存项 如 参数,返回值 output
{
srv_paramsetoutput(pSrvProc, 3, szHash, strlen(szHash), FALSE);
}
else // don't send row if output buffer provided 如果只有一个参数则返回默认字段名
{
srv_describe(pSrvProc, 1, "Exist", SRV_NULLTERM, bType,
cbMaxLen, bType, strlen(szHash), szHash);
srv_sendrow(pSrvProc);
}
srv_senddone(pSrvProc, SRV_DONE_FINAL, 0, 0);
return 0;
}
__declspec(dllexport) SRVRETCODE WINAPI FileExist(SRV_PROC* pSrvProc)
{
int nArgs = srv_rpcparams(pSrvProc);
//如果没有参数则通报正确的使用方法
if(nArgs<0){
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0,
(DBUSMALLINT) __LINE__,
"调用: EXEC FileExist <路径> [返回值 OUTPUT]"
, SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
char *szHash; //返回值
char Pfile[MAX_PATH+1]; //路径
BYTE bType; //获取类型
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
if (nArgs > 0) //如果有设置的返回值的保存项 如 参数,返回值 output
{
srv_paraminfo(pSrvProc,1,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ZeroMemory(Pfile,MAX_PATH+1);
memcpy(Pfile,srv_paramdata(pSrvProc, 1),cbActualLen);
}
FileExists(Pfile)?szHash="1":szHash="0";
//执行后结果
if (nArgs > 1) //如果有设置的返回值的保存项 如 参数,返回值 output
{
srv_paramsetoutput(pSrvProc, 2, szHash, strlen(szHash), FALSE);
}
else // don't send row if output buffer provided 如果只有一个参数则返回默认字段名
{
srv_describe(pSrvProc, 1, "Exist", SRV_NULLTERM, bType,
cbMaxLen, bType, strlen(szHash), szHash);
srv_sendrow(pSrvProc);
}
srv_senddone(pSrvProc, SRV_DONE_FINAL, 0, 0);
return 0;
}
//对文件的复制.
__declspec(dllexport) SRVRETCODE WINAPI FileCopy(SRV_PROC* pSrvProc)
{
int nArgs = srv_rpcparams(pSrvProc);
//如果没有参数则通报正确的使用方法
if(nArgs<1){
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0,
(DBUSMALLINT) __LINE__,
"调用: EXEC FileCopy <路径1> <路径2> <0/1>[返回值 OUTPUT]"
, SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
char *szHash; //返回值
char Sfile[MAX_PATH+1]; //路径
char Dfile[MAX_PATH+1]; //路径.
bool bFailIfExists=0;
BYTE bType; //获取类型
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
//获取第一参数
if(nArgs>1)
{
srv_paraminfo(pSrvProc,1,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ZeroMemory(Sfile,MAX_PATH+1);
memcpy(Sfile,srv_paramdata(pSrvProc, 1),cbActualLen);
}
//获取第二参数
if(nArgs>1)
{
srv_paraminfo(pSrvProc,2,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ZeroMemory(Dfile,MAX_PATH+1);
memcpy(Dfile,srv_paramdata(pSrvProc, 2),cbActualLen);
}
if(nArgs>2)
{
srv_paraminfo(pSrvProc,3,NULL,NULL,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
try
{
//类型转换 为 布尔值
bFailIfExists=(bool)(*(int*)srv_paramdata(pSrvProc, 3));
}
catch(...)
{
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0,
(DBUSMALLINT) __LINE__,
"调用: EXEC FileCopy <路径1> <路径2> <0/1>[返回值 OUTPUT]"
, SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
}
//查看路径是否存在
if (!DirExist(ExtractFileDir(Dfile).c_str()))
{ //先建立单级目录如果失败
if (!CreateDir(ExtractFileDir(Dfile).c_str()))
{
//建立多级目录
MakeDirectoryEx(ExtractFileDir(Dfile).c_str());
}
}
if(nArgs>1)
{
if (CopyFile(Sfile,Dfile,bFailIfExists))
{
szHash="1";
}else{
//DeleteDirectoryEx(ExtractFileDir(Dfile).c_str());
szHash="0";
}
}
//执行后结果
if (nArgs > 3) //如果有设置的返回值的保存项 如 参数,返回值 output
{
srv_paramsetoutput(pSrvProc, 4, szHash, strlen(szHash), FALSE);
}
else // don't send row if output buffer provided 如果只有一个参数则返回默认字段名
{
srv_describe(pSrvProc, 1, "Succeed", SRV_NULLTERM, bType,
cbMaxLen, bType, strlen(szHash), szHash);
srv_sendrow(pSrvProc);
}
srv_senddone(pSrvProc, SRV_DONE_FINAL, 0, 0);
return 0;
}
//对文件的删除.
__declspec(dllexport) SRVRETCODE WINAPI FileDelete(SRV_PROC* pSrvProc)
{
int nArgs = srv_rpcparams(pSrvProc);
if(nArgs<0){
//如果没有参数则通报正确的使用方法
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0, (DBUSMALLINT) __LINE__, "调用: EXEC FileDelete <路径> [返回值 OUTPUT]", SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
char *szHash; //返回值
char Sfile[MAX_PATH+1]; //路径
BYTE bType; //获取类型
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
//获取第一参数
if(nArgs>0)
{
srv_paraminfo(pSrvProc,1,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ZeroMemory(Sfile,MAX_PATH+1);
memcpy(Sfile,srv_paramdata(pSrvProc, 1),cbActualLen);
}
DeleteFile(Sfile)?szHash="1":szHash="0";
if (nArgs > 1) //如果有设置的返回值的保存项 如 参数,返回值 output
{
srv_paramsetoutput(pSrvProc, 2, szHash, strlen(szHash), FALSE);
}
else // don't send row if output buffer provided 如果只有一个参数则返回默认字段名
{
srv_describe(pSrvProc, 1, "Delete", SRV_NULLTERM, bType,
cbMaxLen, bType, strlen(szHash), szHash);
srv_sendrow(pSrvProc);
}
srv_senddone(pSrvProc, SRV_DONE_FINAL, 0, 0);
return 0;
}
//对目录的删除.
__declspec(dllexport) SRVRETCODE WINAPI RDDIR(SRV_PROC* pSrvProc)
{
int nArgs = srv_rpcparams(pSrvProc);
if(nArgs<0){
//如果没有参数则通报正确的使用方法
srv_sendmsg(pSrvProc, SRV_MSG_ERROR, 20000, SRV_INFO, 1, NULL, 0, (DBUSMALLINT) __LINE__, "调用: EXEC RDDIR <路径> <删除整个目录> [返回值 OUTPUT]", SRV_NULLTERM);
srv_senddone(pSrvProc, SRV_DONE_ERROR | SRV_DONE_MORE, 0, 0);
return 1;
}
char *szHash; //返回值
char Sfile[MAX_PATH+1]; //路径
BYTE bType; //获取类型
bool ExtMkDir=false;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
//获取第一参数
if(nArgs>0)
{
srv_paraminfo(pSrvProc,1,&bType,&cbMaxLen,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ZeroMemory(Sfile,MAX_PATH+1);
memcpy(Sfile,srv_paramdata(pSrvProc, 1),cbActualLen);
}
if(nArgs>1)
{
srv_paraminfo(pSrvProc,2,NULL,NULL,&cbActualLen,NULL,&fNull);
if (!cbActualLen) return 1;
ExtMkDir=(bool)(*(int *)srv_paramdata(pSrvProc, 2));
}
if (ExtMkDir)
DeleteDirectoryEx(Sfile);
else
RemoveDir(Sfile);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -