编写安全的扩展存储过程--

编写安全的扩展存储过程--

ID:22739164

大小:60.00 KB

页数:6页

时间:2018-10-31

编写安全的扩展存储过程--_第1页
编写安全的扩展存储过程--_第2页
编写安全的扩展存储过程--_第3页
编写安全的扩展存储过程--_第4页
编写安全的扩展存储过程--_第5页
资源描述:

《编写安全的扩展存储过程--》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、编写安全的扩展存储过程>>  近日在写一个扩展存储过程时,发现再写这类动态库时,还是有一些需要特别注意的地方。之所以会特别注意,是因为DLL运行于SQLServer的地址空间,而SQLServer到底是怎么进行线程调度的,却不是我们能了解的,即便了解也无法控制。  我们写动态库一般是自己用,即便给别人用,也很少像SQLServer这样,一个动态库很有可能加载多次,并且都是加载到一个进程的地址空间中。我们知道,当一个动态库加载到进程的地址空间时,DLL所有全局与局部变量初始化且仅初始化一次,以后再次调用LoadLibrary函数时,仅仅增加其引用计数而已,那么很

2、显然,假如有一全局int,初始化为0,调用一个函数另其自加,此时其值为1,然后再调用LoadLibray,并利用返回的句柄调用输出函数输出该值,虽然调用者觉得自己加载后立即输出,然后该值确实1而不是0。espacestd;externC{RETCODE__declspec(dllexport)xp_part_init(SRV_PROC*srvproc);RETCODE__declspec(dllexport)xp_part_process(SRV_PROC*srvproc);RETCODE__declspec(dllexport)xp_part_finaliz

3、e(SRV_PROC*srvproc);}#defineXP_NOERROR0#defineXP_ERROR1HINSTANCEhInst=NULL;intnRef=0;voidprintError(SRV_PROC*pSrvProc,CHAR*szErrorMsg);ULONG__GetXpVersion(){returnODS_VERSION;}SRVRETCODExp_part_init(SRV_PROC*pSrvProc){typedefbool(*Func)();if(nRef==0){hInst=::LoadLibrary(part.dll);if

4、(hInst==NULL){printError(pSrvProc,不能加载part.dll);returnXP_ERROR;}FunctheFunc=(Func)::GetProcAddress(hInst,Init);if(!theFunc()){::FreeLibrary(hInst);printError(pSrvProc,不能获得分类号与专辑的对应表);returnXP_ERROR;}}++nRef;return(XP_NOERROR);}SRVRETCODExp_part_process(SRV_PROC*pSrvProc){typedefbool

5、(*Func)(char*);if(nRef==0){printError(pSrvProc,函数尚未初始化,请首先调用xp_part_init);returnXP_ERROR;}FunctheFunc=(Func)::GetProcAddress(hInst,Get);BYTEbType;ULONGcbMaxLen,cbActualLen;BOOLfNull;charszInput[256]={0};if(srv_paraminfo(pSrvProc,1,bType,(ULONG*)cbMaxLen,(ULONG*)cbActualLen,(BYTE*)sz

6、Input,fNull)==FAIL){printError(pSrvProc,srv_paraminfo返回FAIL);returnXP_ERROR;}szInput[cbActualLen]=0;stringstrInput=szInput;stringstrOutput=;;intcur,old=0;setoutput(pSrvProc,1,(BYTE*)(szInput+1),strlen(szInput)-1,FALSE)){printError(pSrvProc,srv_paramsetoutput调用失败);returnXP_ERROR;}srv

7、_senddone(pSrvProc,12下一页>>>>这篇文章来自..,。(SRV_DONE_COUNT

8、SRV_DONE_MORE),0,0);returnXP_NOERROR;}SRVRETCODExp_part_finalize(SRV_PROC*pSrvProc){typedefvoid(*Func)();if(nRef==0)returnXP_NOERROR;FunctheFunc=(Func)::GetProcAddress(hInst,Fin);if((--nRef)==0){theFunc();::FreeLibrary(hInst);hIn

9、st=NULL;}return(XP_

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。