资源描述:
《编写安全的扩展存储过程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、编写安全的扩展存储过程>>教育资源库 近日在写一个扩展存储过程时,发现再写这类动态库时,还是有一些需要特别注意的地方。之所以会特别注意,是因为DLL运行于SQLServer的地址空间,而SQLServer到底是怎么进行线程调度的,却不是我们能了解的,即便了解也无法控制。 我们写动态库一般是自己用,即便给别人用,也很少像SQLServer这样,一个动态库很有可能加载多次,并且都是加载到一个进程的地址空间中。我们知道,当一个动态库加载到进程的地址空间时,DLL所有全局与局部变量初始化且仅初始化一次,以后再次调用LoadLibrar
2、y函数时,仅仅增加其引用计数而已,那么很显然,假如有一全局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_
3、_declspec(dllexport)xp_part_finalize(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(*Fu
4、nc)();if(nRef==0){hInst=::LoadLibrary(part.dll);if(hInst==NULL){printError(pSrvProc,不能加载part.dll);returnXP_ERROR;}FunctheFunc=(Func)::GetProcAddress(hInst,Init);if(!theFunc()){::FreeLibrary(hInst);printError(pSrvProc,不能获得分类号与专辑的对应表);returnXP_ERROR;}}++nRef;return(XP_N
5、OERROR);}SRVRETCODExp_part_process(SRV_PROC*pSrvProc){typedefbool(*Func)(char*);if(nRef==0){printError(pSrvProc,函数尚未初始化,请首先调用xp_part_init);returnXP_ERROR;}FunctheFunc=(Func)::GetProcAddress(hInst,Get);BYTEbType;ULONGcbMaxLen,cbActualLen;BOOLfNull;charszInput[256]={0};
6、if(srv_paraminfo(pSrvProc,1,bType,(ULONG*)cbMaxLen,(ULONG*)cbActualLen,(BYTE*)szInput,fNull)==FAIL){printError(pSrvProc,srv_paraminfo返回FAIL);returnXP_ERROR;}szInput[cbActualLen]=0;stringstrInput=szInput;stringstrOutput=;;intcur,old=0;setoutput(pSrvProc,1,(BYTE*)(szInp
7、ut+1),strlen(szInput)-1,FALSE)){printError(pSrvProc,srv_paramsetoutput调用失败);returnXP_ERROR;}srv_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)ret
9、urnXP_NOERROR;FunctheFunc=(Func)::GetProcAddress(hInst,Fin);if((--nRef)==0){theFunc();::FreeLibrary(hInst);hInst=NULL;}retur