为了使得动态库能够被VB调用我增加了关键字__stdcall 
函数声明为
extern "C" __declspec(dllexport) int  __stdcall Init(int width, int height);
这时候vb调用没有问题,但是VC调用时显示the value of esp was not properly saved across a function call ..................,VC是通过m_hDllLpan=LoadLibrary("AAA.dll");   Init = (FUNCINIT)GetProcAddress(m_hDllLpan,"Init");调用的。
    同时去掉关键字__stdcall ,VB调用失败,,,,  VC调用成功。
   这个问题怎么解决》??怎么能让动态库能同时被VC, VB使用????

解决方案 »

  1.   

    DentistryDoctor 那怎么解决??
      

  2.   

    VC调用保证这个FUNCINIT函数定义和输出函数一致。
      

  3.   

    函数声明为
    extern "C" __declspec(dllexport) int  __stdcall Init(int width, int height);
    我的FUNCINIT定义没有问题  
    具体 是这样  typedef int (* FUNCINIT)(int, int);
      

  4.   

    (转载)创建“通用的”动态链接库(DLL)  
    VCKBASE  
        最近有许多人问如何让动态链接库的输出函数能够被任何支持动态链接库的语言调用。写动态链接库是很EASY的事情。但是,他们大多觉得输出的名字有乱字符(如:_vbShiftRight@1)。我想在这里就讨论一下如何让输出函数的名字中不出现乱子符。    首先,除非你绝对需要使用C++编码,否则我还是推荐使用C来写DLL。这里我想让创建的DLL可以在VB中使用。    你需要实现自己DLL的入口点函数和保证代码使用stdcall调用规范,但这要依赖你使用的编译器。例如,你可以在VC中使用“/entry:"DLLEntry"”命令行编译选项来创建自己的入口点。“DLLEntry” 可以参考下列代码:  
    /////////////////////////////////////////////////////////////////////
    // DLL initialization and clean-up.
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
       switch(fdwReason) {      case DLL_PROCESS_ATTACH:         // Perform any DLL initialization here
             break;      case DLL_PROCESS_DETACH:         // Perform any DLL cleanup here
             break;   }
       return TRUE;
    }
     
    为了保证你使用正确的调用规范,要通知编译器使用stdcall规范和/或使用在windows.h(及相关文件)中定义的常量,如WINAPI等。通常DLL的代码如下:  
    /////////////////////////////////////////////////////////////////////
    // Shifts bits right for integers.
    WORD WINAPI vbShiftRight(WORD nValue, WORD nBits)
    {
       return (nValue >> nBits);
    }
     
    下一步是与你在微软文档中读到的内容相反。你需要创建一个DEF文件。这是你防止输出函数名不出现乱字符的唯一方式(如_vbShiftRight@1)。DEF文件的形式如下:EXPORTS
    vbShiftRight下一步是在VB中调用这个函数,使用以下声明:  
    Declare Function vbShiftRight Lib "MYDLL.DLL" (ByVal nValue As Integer, 
      ByVal nBits As Integer)As IntegerSub Test()
       Dim i As Integer
       i = vbShiftRight(4, 2)
       Debug.Assert i = 1
    End Sub
     
    如果你还想要更容易的方法从VB中调用,可以创建一个类型库。为此你需要创建和编译ODL(对象描述语言)文件。这个文件应该包含如下内容:  
    module MyModule {
       [
          helpstring("Shifts the bits of an integer to the right."),
          entry("vbShiftRight")
       ]
       short _stdcall vbShiftRight([in] short nValue, [in] short nBits);
    };
     
        当VB加载DLL的类型库时,函数名和参数将出现在VB的对象浏览器中。此外,如果用户不输入正确的参数类型,VB将产生一个错误。  
    --------------------------------------------------------------------------------
      

  5.   

    一个解决办法:
    函数声明跟平时没咋区别,如
    int func(int i, int j);
    在project->setting->c/c++->Category: 选择Code Generation, 在Calling convention选择__stdcall.
    增加DllExport文件(xxx.def):; xxx.def : Declares the module parameters for the DLL.LIBRARY      "xxx"
    DESCRIPTION  xxxWindows Dynamic Link Library'EXPORTS
        ; Explicit exports can go here
    func @1