静态链接库文件封装成DLL后调用问题,高手请进!!!
cnwhm 2003-12-19 12:52:43 在我的项目中要将第三方RSA的认证集成到项目中,该认证产品提供有SDK包。由静态链接文件(ace_api.lib)
和头文件(apiuser.h)组成。但在C#中只可调用动态链接库,所以在VC中将其封装。
函数原型:
extern int Sd_ApiInit(char *serverDb,char *logDb,char *mode,char *msgBuf,int bufSize);
具体如下:
1、在项目中静态引用lib文件。
2、将apiuser.h文件加入到HeadFiles中。
3、在主程序中敲入下面的代码:
#include "apiuser.h"
//声明apiuser.h中要封装的函数:
int ApiInit(char *serverDb,char *logDb,char *mode,char *msgBuf,int bufSize)
{
int result=Sd_ApiInit(serverDb,logDb,mode,msgBuf,bufSize);
return result;
}
......
......
4、在项目的.def文件中写入要封装的函数:
EXPORTS
ApiInit @1
...... @2
...... @2
5、编译。生成win32dll.dll。
这下,所需的动态链接库文件就生成了。可在C#中使用了。
将编译成功的dll复制至项目输出文件夹下(bin\Debug目录下)
在项目中就可调用了。
代码如下
using System.Runtime.InteropServices
......
[DllImport("win32dll")]
private static extern int ApiInit(string serdb,string logdb,string defser,string msgbuf,int
bufSize);
.....
//调用
pivate void button1_OnClick(object sender,System.EventArgs e)
{
string msg="";
int result=ApiInit("","","1",msg,4096);
MessageBox.Show(result.toString());
......
}
编译执行,执行后单击按钮后程序直接就退出了。但将传递的参数bufSize的值改为其它数值,如ApiInit("","","1",msg,12),会弹出错误代码为1,调用正确,因为传递了错误的参数,但传递正确的参数为何报错?
1、是不是我封装的动态链接库文件有问题?
2、还是函数引用不对?
请高手指点!!!
下面是SDK开发包中带的开发示例中引用这个函数的一部分代码:
#ifndef MAX_RESULT_MSG_SIZE
#define MAX_RESULT_MSG_SIZE 4096 /* Should be in all your applications!!! */
#endif
......
char buffer[MAX_RESULT_MSG_SIZE] = {0};
......
......
error = Sd_ApiInit("","","1", buffer, MAX_RESULT_MSG_SIZE);
下面是函数的使用说明: