读书人

dll动态调用的有关问题

发布时间: 2012-01-16 23:36:51 作者: rapoo

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时只时一个传值动作,所以没有问题。

读书人网 >VC/MFC

热点推荐