首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

dll动态调用的有关问题

2012-01-16 
dll动态调用的问题我用VC2003新建了一个dll项目,在其中添加了连接操作mysql数据库的代码(ODBC方式),再用另

dll动态调用的问题
我用VC   2003新建了一个dll项目,在其中添加了连接操作mysql数据库的代码(ODBC方式),再用另一个项目调用该dll,发现无效,而直接在应用程序中这样做是正确的,用dumpbin发现该dll无导出列表,但是我用同样的方法写的另一个dll是可以的,不知道应该怎么做,望大侠赐教

代码如下:
odbcManager.cpp//dll在此实现

#include   <stdio.h>
#include   <string.h>
#include   <windows.h>
#include   <sql.h>
#include   <sqlext.h>
#include   <odbcss.h>


/*   定义一些在数据库操作中用到的全局变量   */
#define   MAXBUFLEN   255


/*   以下为对odbc数据源的具体操作部分   */

//   连接odbc数据源,传递三个参数:DSN名,用户名,用户密码
char   *   odbcExecute(char   *   dsnname,   char   *   user,   char   *   passwd,   char   *   sql)
{
SQLHENV   henv   =   SQL_NULL_HENV;
SQLHDBC   hdbc   =   SQL_NULL_HDBC;
SQLHSTMT   hstmt   =   SQL_NULL_HSTMT;

RETCODE   retcode;

SQLCHAR   result[MAXNAME+1];
SQLINTEGER   sqlint;


//   out为返回的结果字符串
char   *   out   ;
retcode   =   SQLAllocHandle(SQL_HANDLE_ENV,   NULL,   &henv);
retcode   =   SQLSetEnvAttr(henv,   SQL_ATTR_ODBC_VERSION,   (SQLPOINTER)SQL_OV_ODBC3,   SQL_IS_INTEGER);
retcode   =   SQLAllocHandle(SQL_HANDLE_DBC,   henv,   &hdbc);
retcode   =   SQLConnect(hdbc,   (SQLCHAR   *)dsnname,   SQL_NTS,   (SQLCHAR   *)user,   SQL_NTS,   (SQLCHAR   *)passwd,   SQL_NTS);
if(retcode   ==   SQL_SUCCESS)
{
//   执行sql语句,并返回结果
//   ps.由于从LoadRunner中调用的角度讲,此时所期望得到的只是单一的数据,因此返回的是数据库中的第一条记录,且长度不能超过128
//   对于此处的程序设计,目前不太合理,今后会加以优化

retcode   =   SQLAllocHandle(SQL_HANDLE_STMT,   hdbc,   &hstmt);
retcode   =   SQLPrepare(hstmt,   (SQLCHAR   *)sql,   SQL_NTS);
retcode   =   SQLExecute(hstmt);

retcode   =   SQLBindCol(hstmt,   1,   SQL_C_CHAR,   result,   MAXNAME,   &sqlint);

if(SQLFetch(hstmt)   !=   SQL_NO_DATA)
{
out   =   (char   *)result;
}
else
{
out   =   "Execute   Error ";
}
}
else
{
out   =   "Connect   Error ";
}

//   关闭连接,清理环境
SQLFreeHandle(SQL_HANDLE_STMT,   hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,   hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,   henv);

return   out;
}

odbcManager.h//

#ifndef   LIB_H
#define   LIB_H

//以extern   type   "C "   __declspec(dllexport)形式声明可被外界调用的函数
//extern   "C "   char   *   __declspec(dllexport)   odbcConnect(char   *   dsnname,   char   *   user,   char   *   passwd);
extern   "C "   char   *   __declspec(dllexport)   odbcExecute(char   *   dsnname,   char   *   user,   char   *   passwd,   char   *   sql);

#endif

用来调试的应用程序代码如下
call.cpp

//   call.cpp   :   定义控制台应用程序的入口点。
//

#include   "stdafx.h "
#include   "windows.h "
typedef   char   *   (*lpAddFun)(char   *,   char   *,   char   *,   char   *);

int   _tmain(int   argc,   _TCHAR*   argv[])
{
HINSTANCE   hDll;


lpAddFun   addFun;
hDll   =   LoadLibrary( "odbcManager.dll ");
if(hDll   !=   NULL)
{
addFun   =   (lpAddFun)GetProcAddress(hDll,   "odbcExecute ");
if(addFun   !=   NULL)
{
char   *   res   =   addFun( "test ", "root ", "suzsoft ", "SELECT   passwd   FROM   user ");
printf( "%s ",   res);
}
FreeLibrary(hDll);
}
else
{
}
return   0;
}



[解决办法]
dll的导出函数格式:
extern "C " _declspec(dllexport) bool HideSubStepDlgByName(BSTR bsSubStepName)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//代码
}
[解决办法]
返回的char * out指向局部变量SQLCHAR result[MAXNAME+1],该变量在odbcExecute()运行结束后应该是析构的吧,那么out到底指向什么呢?返回类型为int时只时一个传值动作,所以没有问题。

热点排行