#include "windows.h"
#ifdef C_CPP_DLL
#define MYDLL extern "C" _declspec (dllexport)
#else
#define MYDLL _declspec(dllexport)
#endifMYDLL void initok();
MYDLL void initok2();
MYDLL LPSTR initBUFFER();看看这样不如写文件好啦?怎么LoadLibrary后还要写函数原型出来?

解决方案 »

  1.   

    因为DLL和使用DLL的程序是分别编译的。编译你的程序的时候,编译器并不知道DLL中函数的参数、返回值、调用约定等信息,从而编译器不知道该如何把函数压栈,调用后如何弹栈,这就需要你来把这些告诉编译器,告诉的方法,就是函数类型声明了。
    例如你的函数是 int MyFunc(int a);
    那么类型声明就是 typedef int(*MyFuncProc)(int);
    直接声明变量的话就去掉前面的typedef
    只不过,用LoadLibrary时可以用哪个函数声明哪个函数,而用头文件的话是把所有能用的函数全声明了。
    另外,如果使用的是COM组件,使用#import语句的话编译器会替你从组件中释放出类型库(如果有的话),这样就相当于已经有头文件了,就无需再自己写了
      

  2.   

    typedef int(*MyFuncProc)(int);不明白这里的用法,能写一个例子吗?我发觉LoadLibrary之后不可以使用我DLL里边的函数?
      

  3.   

    我已经生成DLL/LIB了,但是我想复制到其他程序中用,我复制到Debug那处用。
    但是,我LoadLibrary之后,就用DLL里的这个函数initok(); 然后编译器说我没有定义这个函数。怎么回事?应该怎么用的?又要声明一次那个函数啊?或者是又要连接什么东东?
      

  4.   

    用loadlibrary要声明函数或者把lib加到程序里面
    #pragma comment(lib,"my.dll")
      

  5.   

    HINSTANCE hinstLib;
        hinstLib = LoadLibrary("C:\\testprog\\test.dll"); 
        if(!hinstLib)
       {
            AfxMessageBox("err");
      return FALSE;
        }
     
        typedef int ( *max11)(int i1,int i2,int i3);
        max11 myMax;
         myMax = (max11)GetProcAddress(hinstLib,"fun"); 
        int iret = myMax(1,2,3); 
      

  6.   

    typedef int(*MyFuncProc)(int);
    是声明一个指针,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;
    如果是调用dll中带参数的函数应该这样定义吧
    typedef void (FAR __cdecl *MyFuncProc)(int);
    例子:
    dll中
    俄extern "c" __declspec(dllexport) int go (int i)
    {
    .......
    }
    调用
    typedef int(FAR __cdecl *MyFuncProc)(int);HINSTANCE hDLL;
    hDLL = LoadLibrary("**.dll");
    if (hDLL != NULL)
    {
                MyFuncProc myproc;
       myproc =(MyFuncProc)GetProcAddress(hDLL,"go");
    if(myproc ==NULL)
    {
    AfxMessageBox("can't find function");
    FreeLibrary(hDLL);
    }
    else
    {
                           int ii=110;
                           int j=0;
        j=myproc (ii);
                 FreeLibrary(hDLL);
    }
    }
    myMax = (max11)GetProcAddress(DLLpath,"go ");