[偶是初学者]MFC传入调用DLL的问题

emyueguang 2009-07-04 12:15:35
初学MFC,问题可能有些雷人,希望说的详细一点
还是上个贴子的问题,MFC的DLL,控制台搞不出来了,不得已,搞MFC(最恨给别人擦屁股)来调用DLL(那个DLL本来就是用MFC做的,至于他是怎么做的,偶是不知道,只说是测试通过了,他调用没有问题),先看代码(我今天才开始学MFC,自己写的东东):
#include <afxwin.h>

//DLL中要用到的函数
typedef BOOL (*PFUN_1)(CWnd* cWnd, CString dataPath);
typedef BOOL (*PFUN_2)(double dd_1, double dd_2, CString& outInfo);
typedef BOOL (*PFUN_3)();
//

//应用程序控制类
class CHallowApp : public CWinApp
{
public:
virtual BOOL InitInstance();

//加载动态库
private:
BOOL loadingData(CWnd *cWnd);
};
//全局变量
CHallowApp hallowApp;

//主窗体类
class CMainFrame : public CFrameWnd
{
CStatic* cs;
public:
CMainFrame(); //构造函数
};

BOOL CHallowApp::InitInstance()
{
m_pMainWnd = new CMainFrame();

this->loadingData(m_pMainWnd); //加载DLL

m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();

return TRUE;
}

CMainFrame::CMainFrame()
{
Create(NULL,
"Hallow world!",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
cs = new CStatic();
cs->Create("Hallow",
WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(50, 80, 150, 100),
this);
}

//加载DLL
BOOL CHallowApp::loadingData(CWnd *cWnd)
{
try
{
HMODULE hModule;
try
{
hModule = LoadLibrary("subjetUse.dll");
}
catch(...)
{
MessageBox(NULL, "load dll have mistakes.", "Error", MB_OK);
}

try
{
PFUN_1 initializeDLL = (PFUN_1)GetProcAddress(hModule, "InitAndLoadData");
CString dataPath = ".\\";
initializeDLL(cWnd, dataPath);
}
catch(...)
{
MessageBox(NULL, "use InitAndLoadData have mistakes.", "Error", MB_OK);
}

try
{
PFUN_2 lookForData = (PFUN_2)GetProcAddress(hModule, "GoQuery");
double dd_1 = 0; double dd_1 = 0; CString receiveInfo;
lookForData(longitude, latitude, receiveInfo);
}
catch(...)
{
MessageBox(NULL, "use GoQuery have mistakes.", "Error", MB_OK);
}

try
{
PFUN_3 getErrorInfo = (PFUN_3)GetProcAddress(hModule, "GetErrNote");
getErrorInfo();
}
catch(...)
{
MessageBox(NULL, "use GetErrNote have mistakes.", "Error", MB_OK);
}

FreeLibrary(hModule);
return true;
}
catch(...)
{
MessageBox(NULL, "STOP!!", "ERROR", MB_OK);
return false;
}
}

不加载那个动态库就不会出现问题,(其实加载并没有报错,很奇怪,就算我写的不存在的DLL名,它加载的时候也不会报错,就是hModule = LoadLibrary("subjetUse.dll"))这一句不会出错!可是,我只要一调用这个DLL中的函数就会出错,这个DLL对外的是三个函数,不是一个类,错误说我“强奸”了内存,我很郁闷哎,嘿嘿
信息:Unhandle exception in PracticeMFC_5.exe:0x00000005:Access Violation哪位高手帮我一下,把情况说细了,我是刚学MFC的,分不多了,以后分多了再散!
...全文
38 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
supconsupcon 2009-07-05
  • 打赏
  • 举报
回复
你没有DLL的代码吗?单步跟踪一下就知道问题出在哪了
emyueguang 2009-07-04
  • 打赏
  • 举报
回复
楼上的大哥真高人,果然那个动态库要引用别的动态库,这回我加载进来了,可是函数指针用GetProcAddress()获取的却是一个空的地址,为什么啊?难道那个入口函数名有变化?我指的变化是编译过后会产生别的符号,应该不会是这种现象啊?可能会是什么原因呢
supconsupcon 2009-07-04
  • 打赏
  • 举报
回复
你申明的接口为函数指针,是不是需要判定其是否为空?
可能你调用的DLL需要调用其它的DLL,检查是不是有这些DLL,用DEPENDVIEW检查一下
hhwei1985 2009-07-04
  • 打赏
  • 举报
回复
帮顶下
emyueguang 2009-07-04
  • 打赏
  • 举报
回复
楼上的,如何判断DLL的接口指针是不是合法的呢?还有,我的DLL为什么导不进来呢,我项目目录和Debug目录下面都放了*.dll和*.lib了啊,怎么就导入不进来呢?
supconsupcon 2009-07-04
  • 打赏
  • 举报
回复
同意楼上,不光要判断返回值,还要判断DLL的接口指针是不是合法的
oyljerry 2009-07-04
  • 打赏
  • 举报
回复
不是用Catch捕获,而是判断返回值


hModule = LoadLibrary("subjetUse.dll");

if(!hModule)
{
MessageBox(NULL, "load dll have mistakes.", "Error", MB_OK);
}

liangxd09 2009-07-04
  • 打赏
  • 举报
回复
你点书吧 根据书的例子 一步步写 就会了
emyueguang 2009-07-04
  • 打赏
  • 举报
回复
现在是加载动态库不会失败,找到函数入口也可以成功,就是调用会产生异常,但是也就是第一个会产生异常,就是传入CWnd*和CString的的函数产生异常,其它的那两个函数是可以正常调用的,我个人觉得问题还是出在了我传的参数的问题
Gothic_girl 2009-07-04
  • 打赏
  • 举报
回复
载入dll本身不会报错,但是需要对这个载入是否成功进行判断:
hModule = LoadLibrary("subjetUse.dll");
if(hModule == NULL)
{
AfxMessageBox("Loading DLL Failed!");
return FALSE;
}
Daniel22_cn 2009-07-04
  • 打赏
  • 举报
回复
你的代码没有细看,我觉得问题应该是你缺少了调用限定符 __stdcall

加载调用DLL文件类似如下

HMODULE hDll = LoadLibrary(TEXT("aaa"));
if(NULL==hDLL)//加载失败
{Error handle}
DllFunction *pFun = NULL;
pFun = (DLLFunction*)GetProcAddress(hDll,TEXT("bbb"));
if(NULL==pFun)//找到函数入口失败
{Error handle}
pFun(*,*,*);

如果对方仅仅只是给你DLL,你至少需要向他要一个.h的声明文件。
supconsupcon 2009-07-04
  • 打赏
  • 举报
回复
".\\"表示当前文件夹的路径而不是当前文件的路径
能说说接口是实现什么功能吗?编程的规范性实在不敢恭维
  • 打赏
  • 举报
回复
谁做的DLL 跟他要一个使用的demo啊
emyueguang 2009-07-04
  • 打赏
  • 举报
回复
8楼说的那个,其实我已经实现了动态的引用入口函数了,没有必要用那种静态的方式了
现在的问题就是,调用这个函数的时候会出现问题,它有两个参数一个CWnd*,一个CString表示文件的路径,我传的是".\\",即,当前目录下面,那个CWnd*我传的就是上面说的那个我自己定义的CMainFram的实例的指针,请问,这样有什么不对么?
emyueguang 2009-07-04
  • 打赏
  • 举报
回复
函数入口果然是出现了乱码的问题,这回可以成功的加载动态库,也可以成功的获取函数的入口地址了,就是引用那个要传入CWnd*参数的函数的时候回出现异常现象,我传入的是我自己定义的CMainFrame的指针,就是
m_pMainWnd = new CMainFrame();

this->loadingData(m_pMainWnd); //将这个主窗口的框架实例的指针传过去,这个函数调用了DLL的加载函数,引用

//传过去之后,就是执行下面的显示&更新窗口
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
难道之前没有创建主窗口的实例?
lfm13720 2009-07-04
  • 打赏
  • 举报
回复
用Depend看下DLL里导出的函数名称是什么

至于*.lib的用法是在源文件中加入 #pragma comment(lib,"*.lib")
最好是加在包含头文件的地方。

//这个代码仅供参考,具体怎么用还要看DLL
//代码中直接使用这三个函数就可了,不用再用LoadLibrary和GetProcAddress
extern "C" BOOL __declspec(dllimport) InitAndLoadData(CWnd* , CString);
extern "C" BOOL __declspec(dllimport) GoQuery(double, double dd_2, CString&);
extern "C" BOOL __declspec(dllimport) GetErrNote();

#pragma comment(lib,"*.lib")


资源下载链接为: https://pan.quark.cn/s/9ce3e35e0f39 本文将为初学者详细讲解如何利用C++语言在MFC框架下实现与SQL Server 2008的连接以及执行数据库添加操作。这是一份基础入门指南,旨在帮助大家掌握MFC与SQL Server交互的基本流程。在编写程序时,需包含相关头文件和库,比如#include ,它涵盖了MFC用于数据库访问的类;还有#import dll>,用于引入ADO接口。 首先,要建立数据库连接。可以使用MFC中的CDaoDatabase类来创建与SQL Server的连接。创建一个CDaoDatabase对象,接着调用Open函数,将数据库的ODBC数据源名称(DSN)作为参数传入。DSN是在控制面板的ODBC数据源管理器里配置好的,里面包含了服务器名、数据库名、用户名和密码等关键信息。示例代码如下: 其次,执行SQL命令。MFC提供了CDaoCommand或CDaoRecordset类来执行SQL语句,对于添加操作,一般使用CDaoCommand,它能直接执行非查询的SQL语句。创建一个CDaoCommand对象,设置好SQL命令,再调用Execute函数。代码示例如下: 其中,TableName是操作的表名,Column1、Column2是表里的字段名,value1、value2是将要插入的数据。 在执行数据库操作过程中,一定要做好错误处理。可以通过检查CDaoDatabase和CDaoCommand对象的m_pError成员来获取错误信息。 操作完成后,别忘了关闭数据库连接,释放掉占用的资源。代码如下: 除了使用MFC的DAO,还可以采用更现代的ADO接口。ADO支持更广泛的数据库访问,与MFC的集成也很紧密。使用_ConnectionPtr和_CommandPtr对象

16,551

社区成员

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

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

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