//定义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);
}}
#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);
}}
解决方案 »
- 程序运行一半后退出
- 各位朋友请进来帮忙看一下,ODBC调用存储过程的问题
- 傲游2界面问题,大家都来发表一下看法,给点建议
- 我想问下..不用WINAPI去读取INI文件怎么读???
- txt格式文本分割
- 一个CFile 的 Read() 问题,怎么读出来的长度和指定的长度不同呀?急等!先谢!
- 请教CTreeCtrl::InsertItem()中的参数的详细用法??
- cin.getline()方法是做什么用的?
- Firefox Plugin开发遇到问题
- 第一次点菜单的open打开一个数据文件时,会自动调用CXjjDoc::Serialize(CArchive& ar),但当我回过头来第二次打开同一个文件时,调试跟踪标明不能进入CXjjDoc::Serialize(CArchive& ar),为什么呢?
- 嵌入EXCEL工程的保存问题,急~~
- MFC中使用GDI,怎样画一条闪烁的直线
******************************************
//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
#endifstatic 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文件拷贝到相应的目录下面.
没有问题吧!
发现是DLL文件中少了 extern "C" ,应该是供外部引用的吧?
extern "C" __declspec(dllexport) int msg(int i)