DLL的困惑! 非常苦恼,请各位朋友帮忙看看吧,叩谢了!
//定义DLL.dll
#include "stdafx.h"
#include "cwindow.h"
int __declspec(dllexport) msg(int i)
{ return i+1; }
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{ switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{ break ; }
case DLL_PROCESS_DETACH:
{ break ; }
}
return TRUE;
}
//调用函数
// 在CTestdllDlg头文件中定义
//typedef int (*Func)(int); //定义:方式1
typedef int __declspec(dllexport) (*Func)(int); //定义:方式2
Func pdll;
//CTestdllDlg实现文件代码如下
//问题描述:可以成功打开DLL.dll, 但是运行到“j=(pdll)(10); ”便出错,
//尝试采用方式1定义函数也出错
void CTestdllDlg::OnButton1()
{
// TODO: Add your control notification handler code here
HINSTANCE hModule=::LoadLibrary("DLL.dll");
if(NULL==hModule)
{
MessageBox("LoadLibrary failed");
}
else
{
MessageBox("动态连接库成功打开...","LoadLibrary",MB_OK);
Func pdll;
pdll=(Func)GetProcAddress(hModule,"msg");
CString str="";
int j=2;
j=(pdll)(10); //程序运行到此处即报错误提示
str.Format("%d",j);
MessageBox(str);
FreeLibrary(hModule);
}
}
问题点数:50、回复次数:5Top
1 楼disque()回复于 2005-08-01 00:50:22 得分 0
抱歉,头文件中多了一句 “Func pdll”Top
2 楼Microsnow(冰火)回复于 2005-08-01 08:26:38 得分 50
具体的错误提示是什么?
应该先排除你调用上的错误,然后再去其它方面去查找原因.Top
3 楼Microsnow(冰火)回复于 2005-08-01 08:58:23 得分 0
我在VS .net 2003+Windows 2000 Professional(SP4):
DLL部分:
******************************************
//test.h
#ifndef __TEST_H
#define __TEST_H
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) int msg(int i);
#ifdef __cplusplus
}
#endif
#endif
============================================================
//test.cpp
// test.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include <afxdllx.h>
#include "test.h" //include local file
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
static AFX_EXTENSION_MODULE testDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("test.DLL 正在初始化!\n");
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(testDLL, hInstance))
return 0;
// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL(如 ActiveX 控件)隐式链接到
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。
new CDynLinkLibrary(testDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("test.DLL 正在终止!\n");
// 在调用析构函数之前终止该库
AfxTermExtensionModule(testDLL);
}
return 1; // 确定
}
extern "C" __declspec(dllexport) int msg(int i)
{
return i+1;
}
****************************************************
MFC应用程序(调用DLL):
......
#include "test.h" //include file for DLL calling
......
......
void CTestDLLDlg::OnBnClickedTestdll()
{
// TODO: 在此添加控件通知处理程序代码
typedef int (*MSGType)(int i); //define a funcion pointer
HINSTANCE hModule = LoadLibrary(_T("test.dll"));
if (NULL == hModule)
{
::MessageBox(NULL, _T("Load library failed"), _T("Test DLL"), MB_OK);
return;
}
MSGType msg = (MSGType)GetProcAddress(hModule, _T("msg"));
if (NULL != msg)
{
CString str = "";
int j = 0;
j = msg(20);
str.Format("%d", j);
MessageBox(str);
}
FreeLibrary(hModule);
}
......
当然记得要将test.dll文件拷贝到相应的目录下面.
没有问题吧!
Top
4 楼Microsnow(冰火)回复于 2005-08-01 09:01:49 得分 0
注意,以上我用"MFC扩展DLL"Top
5 楼disque()回复于 2005-08-02 00:17:48 得分 0
多谢 Microsnow(冰火),可以了,
发现是DLL文件中少了 extern "C" ,应该是供外部引用的吧?
extern "C" __declspec(dllexport) int msg(int i)Top




