还剩4页未读,继续阅读
文本内容:
编写安全的SQL Server扩展存储过程数据库教程电脑资料server|安全|存储过程近日在写一个扩展存储过程时,发现再写这类动态库时,还是有一些需要特别注意的地方之所以会特别注意,是因为DLL运行于SQL Server的地址空间,而SQL Server到底是怎么进行线程调度的,却不是我们能了解的,即便了解也无法控制我们写动态库一般是自己用,即便给别人用,也很少像SQL Server这样,一个动态库很有可能加载多次,并且都是加载到一个进程的地址空间中我们知道,当一个动态库加载到进程的地址空间时,DLL所有全局与局部变量初始化且仅初始化一次,以后再次调用LoadLibrary函数时,仅仅增加其引用计数而已,那么很显然,假如有一全局int,初始化为0,调用一个函数另其自加,此时其值为1,然后再调用Loa dLibray,并利用返回的句柄调用输出函数输出该值,虽然调用者觉得自己加载后立即输出,然后该值确实1而不是0windows是进程独立的,而在线程方面,假如不注意,上面的情况很可能会程序员带来麻烦介绍一下我的扩展存储过程,该动态库导出了三个函数:Init,work,Final,Init读文件,存储信息于内存,work简单的只是向该内存检索信息,Final回收内存如上所说,假如不考虑同一进程空间多次加载问题,两次调用Init将造成无谓的浪费,因为我第一次已经读进了内存,要是通过堆分配内存,还会造成内存泄露我使用的引用计数解决的该问题,代码很短,直接贴上来#include stdafx.h#include usingnamespace std;extern C{RETCODE__declspecdllexport xp_part_initSRV_PROC*srvproc;RETCODE__declspecdllexport xp_part_processSRV_PROC*srvproc;RETCODE__declspecdllexport xp_part_finalizeSRV_PROC*srvproc;}#define XP_NOERROR0#define XP_ERROR1HINSTANCE hInst=NULL;int nRef...。