大家进来看看阿!急着给分的!

likeprogrammer 2003-10-05 02:26:10
我写了一个DLL,编译都通过了,但在别的程序中却装载错误!我的DLL框架是这样的.(采用regular share mfc dll的方式.)
请各位想想办法阿!急!

DLL的.H文件(主要的)

class CWyldbApp : public CWinApp
{
public:
CWyldbApp();

// Operations
public:
CString m_ADOErrStr;
_RecordsetPtr m_pRecordset;
_ConnectionPtr m_pConnection;
int DataBaseConnect(LPCTSTR DBSrc,LPCTSTR DBpwd);

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CWyldbApp)
//}}AFX_VIRTUAL
//{{AFX_MSG(CWyldbApp)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_WYLDB_H__9142A2D4_5A6C_463A_910A_1DFEF72A8DA3__INCLUDED_)

DLL的.CPP文件(主要的)

int CWyldbApp::DataBaseConnect(LPCTSTR DBSrc,LPCTSTR DBpwd)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
m_ADOErrStr.Empty();      //在这句出错
if (DBSrc=="" || DBSrc==NULL)
{
m_ADOErrStr.Format("%s","123");
return(FALSE);
}

AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
     CString constr;
constr.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Jet OLEDB:Database Password=%s;",DBSrc,DBpwd);
m_pConnection->Open((_bstr_t)(constr),"","",adModeUnknown);
}
catch(_com_error e)
{
m_ADOErrStr.Format("%s",(LPCTSTR)(_bstr_t)(e.Description()));
return FALSE;
}
return TRUE;
}
...全文
31 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gelim 2003-10-10
  • 打赏
  • 举报
回复
顶!
woaini5994 2003-10-09
  • 打赏
  • 举报
回复
是不是你在连接的时候出现问题
likeprogrammer 2003-10-09
  • 打赏
  • 举报
回复
up
likeprogrammer 2003-10-08
  • 打赏
  • 举报
回复
to superS(super慢):

您的第一个输出类的方法是挺好的,但是我这个DLL除了给VC使用之外,还需要给VB等其它程序使用,而输出一个类在VB里不好操作。

第二个方法我看看!

真的很谢谢您!
superS 2003-10-08
  • 打赏
  • 举报
回复
又怎么了???
likeprogrammer 2003-10-08
  • 打赏
  • 举报
回复
问题就真的石沉大海了?vc版就真的没有高人了?我不相信!我等!
superS 2003-10-08
  • 打赏
  • 举报
回复
可以输出类,没问题。

至少两个解决办法:
第一你可以把你所需要的功能做成一个类,输出之。例如这是我做的类:

// MyEC.h: interface for the CMyEC class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MYEC_H__DD30F5F5_0BD0_478D_8F2D_D009B143986A__INCLUDED_)
#define AFX_MYEC_H__DD30F5F5_0BD0_478D_8F2D_D009B143986A__INCLUDED_

#ifdef MAPPARSER_EXPORTS
# define DECLSPECIFIER __declspec(dllexport)
# define EXPIMP_TEMPLATE
#else
# define DECLSPECIFIER __declspec(dllimport)
# define EXPIMP_TEMPLATE extern
#endif

class DECLSPECIFIER CMyEC
{
public:
int Return1();
CMyEC();
virtual ~CMyEC();

};

#endif // !defined(AFX_MYEC_H__DD30F5F5_0BD0_478D_8F2D_D009B143986A__INCLUDED_)
-------------------------------------------------------------------------------
// MyEC.cpp: implementation of the CMyEC class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MFCDLL.h"
#include "MyEC.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyEC::CMyEC()
{

}

CMyEC::~CMyEC()
{

}

int CMyEC::Return1()
{
return 1;
}
---------------------------------------------------------------------------
然后在主程序需要的地方#include myec.h,然后直接产生CMyEC ec;int i = ec.return1();
注意你的dll工程需要project->setting->c/c++ ->Preproseer definitions中加入MAPPARSER_EXPORTS

第二个方法,不输出这个类,而是输出一个全局函数,在这个全局函数中产生类实例,操作,但是这种办法状态不易保存,适用于当时操作马上结束的那种操作。

你应该明白,把函数声明在类定义中,那它就是类的成员函数,比如
int CMyEC::Return1();//这才是她的全称。而且C++会对其进行名字粉碎,名字还会变。
而且非静态的成员函数编译器都会给加上this指针,你以前没出错我估计是因为你碰巧没用上this,可能你都是操作全局变量来着?总之现在出错是因为函数把一个错误位置上的量当成this来使用而引起的。也就是编译器实际产生的语句是:this->m_ADOErrStr.Empty();而此时根本就没有this。
likeprogrammer 2003-10-08
  • 打赏
  • 举报
回复
superS(super慢) ,
您说“dll都是输出全局函数或者直接输出类”,我有几个问题问一下你:

首先,“dll都是输出全局函数”意思是不是我的输出函数不能定义在类里面?这个,我试试,但是我曾经做过一个"Regular DLL using shared MFC DLL",输出函数就是定义在类里面,并且没有加任何修饰,如extern "C",调用都非常好!为什么呢?原谅我是菜鸟!

其次,“dll或者直接输出类”,但是好象"Regular DLL using shared MFC DLL"不能输出类,而"MFC Extension DLL(using shared MFC DLL)"才可以输出类阿!我现在丈二和尚摸不着头脑了,我真的很菜!

再次谢谢superS(super慢)!

可能这个问题是真的很烦人,我现在还有960分,如果能解决我给所有分都行!只要快点就好!
mfc168 2003-10-07
  • 打赏
  • 举报
回复
hDLL=LoadLibrary("我的动态连接库.dll");
if (hDLL==NULL)
{
//装载dll错误
return -1;
}
likeprogrammer 2003-10-07
  • 打赏
  • 举报
回复
mfc168(闶阆) ,确实是内存出现了错误,但我不知道怎么解决它!希望能得到你的帮助!

superS(super慢) , 我使用显式调用方法,就是使用LoadLibrary,具体代码如下:

//////////////////////////////////////////////////////////////////////////////
HINSTANCE hDLL;
typedef int (*_tDataBaseConnect)(LPCTSTR DBSrc,LPCTSTR DBpwd);
_tDataBaseConnect tDataBaseConnect;
hDLL=LoadLibrary("我的动态连接库.dll");
tDataBaseConnect=(_tDataBaseConnect)GetProcAddress(hDLL,"DataBaseConnect");

const CString db="1.mdb",pwd="123";
int a=tDataBaseConnect(db,pwd);

FreeLibrary(hDLL);

//////////////////////////////////////////////////////////////////////////////
恳请各位的帮助!谢谢!
likeprogrammer 2003-10-07
  • 打赏
  • 举报
回复
VC版到底怎么了?

真的遇到难题了?

还是因为现在是国庆,大家HAPPY去了!

这几天的气氛不浓阿!
mfc168 2003-10-07
  • 打赏
  • 举报
回复
Unhandled exception in mfcdll.exe(我的DLL名称.dll):0xC0000005:Access Violation

这个是你的mfcdll.exe这个工程出问题了,没有说你的DLL有错误啊???
错误应该是内存错误,或者使用了空指针
superS 2003-10-07
  • 打赏
  • 举报
回复
这个函数你是怎么调用的?

把调用的那部分代码贴出来看看。
superS 2003-10-07
  • 打赏
  • 举报
回复
我知道了。

DataBaseConnect这个函数是一个类的成员函数,成员函数在被调用时是有一个this指针的。尤其是在这个成员函数中要处理成员变量时。这个知识点你了解吧。

你的def虽然输出了这个函数(这种输出方法我头一次见啊),但主程序只能把它当成一个普通函数来对待,调用时自然不会传进去this指针的(他想传也没得可传)。所以在运行时刻,出现runtime error。明白了吧。

据我所知dll都是输出全局函数或者直接输出类,没有像你这么干的。:)
zhangym365 2003-10-07
  • 打赏
  • 举报
回复
“其中ADOErrStr是我类中的一个全局变量!”类中怎么会有全局变量?
可能不是执行到 m_ADOErrStr.Empty();时出错,而是调用到函数的第一句语句时出错!
likeprogrammer 2003-10-07
  • 打赏
  • 举报
回复
整个都是我写的!只有一个函数叫DataBaseConnect。
我使用extern "C"修饰后会出现错误!不编译就通过了(指DLL文件)
还有就是我以前写过一个这样的DLL(REGULAR SHARE DLL),没有加extern "C"修饰,在别的程序中调用很好,但这个却不行!
我的DEF文件如下:
; db.def : Declares the module parameters for the DLL.

LIBRARY "db"
DESCRIPTION 'db Windows Dynamic Link Library'

EXPORTS
; Explicit exports can go here

DataBaseConnect @1

还有,我的问题是执行到m_ADOErrStr.Empty();时出错,其中ADOErrStr是我类中的一个全局变量!

恳请大家继续关注!谢谢!
cyply 2003-10-07
  • 打赏
  • 举报
回复
顶一下
dzqsuper 2003-10-07
  • 打赏
  • 举报
回复
顶一下先
superS 2003-10-07
  • 打赏
  • 举报
回复
我照着你最上面的帖子也建了一个类似的dll,然后从主程序中调用,GetProcAddress返回的是NULL。

你是不是有输出的全局函数也叫DataBaseConnect啊?而且是用extern "C"标注过的?

整个dll都是你自己写的吗?看看def文件中是怎么写的。

还有其他程序文件,找extern "C"都在那里出现过?
zhangym365 2003-10-07
  • 打赏
  • 举报
回复
在编译选项中加入 /Gz 选项尝试一下看,将函数设置为 __stdcall调用方式。
加载更多回复(24)

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧