//定义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);
}}

解决方案 »

  1.   

    抱歉,头文件中多了一句 “Func pdll”
      

  2.   

    我在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
    #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文件拷贝到相应的目录下面.
    没有问题吧!
      

  3.   

    多谢 Microsnow(冰火),可以了,
    发现是DLL文件中少了 extern "C" ,应该是供外部引用的吧?
    extern "C" __declspec(dllexport) int msg(int i)