⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extendmain.cpp

📁 BCB 编写的一些简单函数用于SQL的扩展存储过程. -检查文件是否存在Select dbo.FileExist( c:oot.ini ) --删除文件Select dbo.FileDelete(
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#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 + -