社区
疑难问题
帖子详情
嵌入C函数的参数使用问题
njtlxm
2004-01-07 05:05:49
做了一个嵌入C的函数,以DLL形式放在master库中,现在的问题是:
我想给这个函数传递几个参数,然后在函数结束的时候把各个结果放在这几个参数中返回.就好像C++里面的"参数引用"一样的作用,能做到吗?我刚才测试了一下,不行.
...全文
44
5
打赏
收藏
嵌入C函数的参数使用问题
做了一个嵌入C的函数,以DLL形式放在master库中,现在的问题是: 我想给这个函数传递几个参数,然后在函数结束的时候把各个结果放在这几个参数中返回.就好像C++里面的"参数引用"一样的作用,能做到吗?我刚才测试了一下,不行.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
njtlxm
2004-01-12
打赏
举报
回复
多谢各位,我已经找到解决办法了,就是扩展存储过程加上嵌入C,真是TMD麻烦,呵呵,放分了!
OpenVMS
2004-01-07
打赏
举报
回复
SQL中调用这个函数?先要编成DLL,加为扩展存储过程,就象普通存储过程一样的调用
zjcxc
2004-01-07
打赏
举报
回复
没用过VC
上面的方法应该可行.
njtlxm
2004-01-07
打赏
举报
回复
这个例子我看过,但是不能解决我的问题
比如说就是上面的例子中,函数addLine的参数为两个szValue1 和szValue2
如何在SQL中调用这个函数,将参数通过这两个参数传入,在addLine函数结束时,将结果通过这两个参数返回?
txlicenhe
2004-01-07
打赏
举报
回复
没做过,转贴:
在存储过程中调用外部的动态连接库(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
一个功能强大的
嵌入
式shell
letter shell是一个C语言编写的,可以
嵌入
在程序中的
嵌入
式shell,主要面向
嵌入
式设备,以C语言
函数
为运行单位,可以通过命令行调用,运行程序中的
函数
功能 命令自动补全 快捷键功能定义 命令权限管理 用户管理 变量支持 代理
函数
和
参数
代理解析
C语言 |
函数
指针作为
函数
的
参数
函数
指针有两种常用的用法,一种是作为结构体成员,关于
函数
指针作为结构体成员的用法可移步至上一篇【C语言笔记】
函数
指针作为结构体成员进行查看。另一种是
函数
指针作为
函数
的
参数
。这一篇分享的是
函数
指针作为
函数
的
参数
。 一、
函数
指针作为
函数
的
参数
函数
指针可以作为一个
参数
传递给另一个
函数
。这时
函数
指针的
使用
就像普通的常量和变量一样。当
函数
指针作为
参数
传递的时候,这时接收
参数
传递的
函数
通常需要根据这个指针调...
极简C语言入门课程
一、C语言自我介绍1、C语言自二十世纪70年代诞生以来,发展到今天2022年,这门开发语言还是强盛不衰,在如今物联网,
嵌入
行业,对智能控制方面,C语言的应用大放其彩,一些中小企业以它为底层,结合市场特点,开发自己微小独特产品。2、讲师从1996的接触C语言,经历见证过很多的开发语言,从辉煌到衰落过程,比如:以前Foxpro、VB、delphi不知有多火,但现在很少有用了,只能在一些老项目还在
使用
。反观C语言基本上一直占据编程语言排行榜的前5名。3、C语言是面向过程语言,是许多高级计算机语言的基础,C语言通过windows/linux平台下编译的,它执行的速度可以说远远越超其它高级语言。4、课程前第1节到8节,
使用
动画方式讲课,这样学习起来更形象化,通过动画人物的讲解,把复杂
问题
简单化,一目了然。5、第9节至第20节,结合了ppt讲解,加入实例代码,加深理解。6、通过学习C语言,让人有一个整体概念,为日后学习其它高级语言打下基础。
C语言
函数
指针 | 作为
函数
参数
作为结构体成员
函数
指针有两种常用的用法,一种是作为结构体成员,另一种是
函数
指针作为
函数
的
参数
。 1、
函数
指针作为
函数
的
参数
函数
指针可以作为一个
参数
传递给另一个
函数
。这时
函数
指针的
使用
就像普通的常量和变量一样。当
函数
指针作为
参数
传递的时候,这时接收
参数
传递的
函数
通常需要根据这个指针调用这个
函数
。作为
参数
传递的
函数
指针通常表示回调
函数
(Callback Functions)。 回调
函数
已在之前一篇文章中有所介绍,下面我再举其他例子进行介绍。 什么是回调
函数
函数
指针可以作为一个
参数
传递给另一个
函数
。这时
函数
指针的
使用
就像普
C语言
函数
的嵌套调用
学习C语言的过程中我们会遇到许多的难题,我个人感觉C语言中
函数
是我们遇到的第一个难题。C语言
函数
可以从不同的角度来进行分类,比如从
函数
定义的角度分可以分为库
函数
和用户
函数
;从
函数
返回角度来进行分类,可以分为无返回值
函数
和有返回值
函数
;从
函数
传递的角度分,可以分为无
参数
函数
和有
参数
函数
。从
函数
的作用来说,
函数
是实现一定功能的子程序,它是C语言源程序的基本模块,用来表示模块化程序设计中的各个功能模块。在程序设计时规划与设计合理的
函数
可以使整个程序结构清晰,容易调试和维护。C语言
函数
的调用时其中的一个难点. C语
疑难问题
22,207
社区成员
121,730
社区内容
发帖
与我相关
我的任务
疑难问题
MS-SQL Server 疑难问题
复制链接
扫一扫
分享
社区描述
MS-SQL Server 疑难问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章