在使用DEF文件导出的dll的程序中,需要声明各个导出的函数吗?
  如果需要是使用dll中编译后的函数名(也就是DEF文件中的函数名)吗?如果是那在应用程序中编译的时候会不会再度被修饰?

解决方案 »

  1.   

    使用了def就会制定导出函数名,从而防止被修饰
    使用了def,也还可以申明导出函数
      

  2.   


    int  add(int a,int b)
    {
    return a + b ;
    }int  subtract(int a,int b)
    {
    return a - b ;
    }这段代码写于.cpp中
    LIBRARY Dll2 //.dll名EXPORTS 
    add
    subtract这段代码写于.def中
    这样导出的函数就是add和subtract函数啦
      

  3.   

     怎么防止被修饰呢? extern "c"? 指定导出函数名是什么意思?
      

  4.   

    extern C是以C的方式修饰导出函数名
    def就是告诉编译器不要修饰..
      

  5.   

    没关系的,其实只要dll能用就可以了,
      

  6.   

      是在DLL中不要修饰 那在应用程序中使用的时候也不会修饰吗?
      

  7.   

    extern "C"是为了实现C++与C及其它语言的混合编程,使编译器对函数的编译采用C方式
    可以用.DEF防止函数名被修饰
      

  8.   


    void CDllTestDlg::OnBtnAdd() //点击按钮,显示5+3的值
    {
    // TODO: Add your control notification handler code here HINSTANCE hInst;
    hInst = LoadLibrary("Dll2.dll");
    typedef int (* ADDPROC)(int a,int b);
    ADDPROC Add = (ADDPROC) GetProcAddress(hInst,"add"); if(!Add)
    {
    MessageBox("获取函数地址失败!");
    return ;
    }
    CString str;  
    str.Format("5+3=%d",Add(5,3));
    MessageBox(str);
    FreeLibrary(hInst);
    }这是其中的一种使用方式,lz看一下吧。
      

  9.   


    void CDllTestDlg::OnBtnAdd() 
    {
    // TODO: Add your control notification handler code here HINSTANCE hInst;
    hInst = LoadLibrary("Dll2.dll");
    typedef int (* ADDPROC)(int a,int b);
    ADDPROC Add = (ADDPROC) GetProcAddress(hInst,"add"); if(!Add)
    {
    MessageBox("获取函数地址失败!");
    return ;
    }
    CString str;  
    str.Format("5+3=%d",Add(5,3));
    MessageBox(str);
    FreeLibrary(hInst);
    }这是使用.dll的一种方式,要把导出的Dll2.dll放在要使用的工程下,lz看一下吧
      

  10.   

    def制定函数名了,应用程序使用的时候,就可以直接用函数名来GetProcAddress
      

  11.   

    那要是用lib文件静态调用呢?
      

  12.   

    DEF主要是用于DLL的动态调用的,可以使得导出函数按你的意愿具有好的“可读性”,这样GetProcAddress时也看着比较舒服;
    LIB文件用于DLL的静态调用,里面的符号跟def文件没联系,也就是说里面的符号还是经过编译器改编过的,和头文件配合使用
      

  13.   

    def主要是用在动态调用,你静态调用lib,直接包含导出dll的h文件,然后就可以调用h中的函数,不用关心函数修饰..