C++Builder 写的一个动态库,对应函数,
        如下: extern "C" __declspec(dllexport)  int __stdcall GetPIDByCardNo( char* sCardNo, char* sPID, char* sErr );       VC2008中在控制台程序上可以调用,程序如下:
typedef int ( _stdcall *GetPIDByCardNoFunc )( char *, char *, char * );int main()
{
       char sCardNo[18];
       char sPID[20];
       char sErr[100];
       memset( sCardNo, 0x00, sizeof( sCardNo ) );
       memset( sPID, 0x00, sizeof( sPID ) );
       memset( sErr, 0x00, sizeof( sErr ) );
       strncpy( sCardNo, "87109823", sizeof( sCardNo ) - 1 );       GetPIDByCardNoFunc  _GetPIDByCardNoFunc ;

       HINSTANCE hInstLibrary = LoadLibrary(L"KCPIDNO.dll"); 
       if (hInstLibrary == NULL) 
       { 
         
         FreeLibrary(hInstLibrary); 
       }
       else
       { 
          
       }        _GetPIDByCardNoFunc = (GetPIDByCardNoFunc)GetProcAddress( hInstLibrary, "GetPIDByCardNo" );
      
       if ( _GetPIDByCardNoFunc == NULL ) 
       { 
           FreeLibrary( hInstLibrary ); //释放 
       }
       else
       { 
           _GetPIDByCardNoFunc( sCardNo, sPID, sErr );
  
   cin.get();   FreeLibrary(hInstLibrary); // 调用完后,要释放内存。 
     } 
     
}
同样的调用程序将其放到 ActiveX工程中就出现 GetProcAdrress 返回 GetPIDByCardNoFunc  值为 NULL??
     这是怎么回事呢???
     拜求指点。谢谢!!!??

解决方案 »

  1.   

    http://topic.csdn.net/t/20020312/11/570245.html
      

  2.   

    Visual C++ 调用 C++ Builder 的dll: (参考:MSDN2000)
    VC中无LIB时的DLL隐式链接,制作与VC++相符合的LIB函数符号输入库(转)请大家注意!这种方法只能应用于输出为C格式的__stdcall调用方式!
    1.使用VC++的工具DUMPBIN将DLL中的导出函数表导出到一定义(.DEF)文件
    EXAMPLE:
    DUMPBIN VideoDeCoder.dll /EXPORTS /OUT:VideoDeCoder.def
    2.将导出的.DEF文件整理为一符合.DEF个数的函数导出文件(整理过程巨乱巨复杂,懒得举例了,后面有简便方法^_^)
    3.使用VC++的LIB工具,带/DEF:(.def文件名) /MACHINE:IX86(80X86机器),就输出符合VC++格式的的LIB文件了.
    EXAMPLE:
    LIB/DEF:VideoDeCoder.def /MACHINE:IX86
    4.连接时带上LIB文件链接;注意的是当有些动态库DUMPBIN的只有函数名,无"@nn"的参数格式,如C++Builder写的DLL,输出就只有函数名符号,链接时就会报错:
    error LNK2002:unresolved external symbol "functionname@nn"
    提示程序中引入的函数符号无法识别,这时只要将DEF文件中相应的函数名称改为functionname@nn方式,重新建立LIB,重新链接即可.
    这样就制作成功了符合VC调用方式的LIB了!要值得一说的是!BORLAND C++BUILDER有一个很好的工具IMPDEF可以直接将DLL中的函数输出到.DEF文件中,这种方法只能应用于输出为C格式的__stdcall调用方式,只要做一点点修改就可以成为符合VC的DEF文件!
    IMPDEF xxx.def xxx.dll
    只要将BCB的DEF文件中函数申明格式转换为vc识别的格式就可以利用LIB工具生成LIB;要使用C分格输出(extern "C")才是必须的!而且别忘了在DEF文件中的函数申明不要带“_”啊!:)不然会出现error LNK2001的链接错误!
    vc调用bcb的我没试过,不过可以参照上面的格式自己改改好了:)
      

  3.   

    人呢? 进展如何?
    我还是给你贴个 我自己做的例子吧//C++Builder  dll CPP
    #pragma argsused
    extern "C" _declspec(dllexport) int __stdcall CircleArea(int r);
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    //---------------------------------------------------------------------------
    int __stdcall CircleArea(int r)
    {
      int s =r+100 ;
      return s;
    }
    //--------------------------------------------------------------
    //VC  调用部分
    void CLocalDllDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    // TODO: 在此添加控件通知处理程序代码
    HINSTANCE hDllInst = LoadLibrary("Project1.dll");
    if(hDllInst)
    {
    typedef int(_stdcall  *CircleArea)(int r) ;
    CircleArea  youFuntionNameAlias = (CircleArea)GetProcAddress(hDllInst,"CircleArea");
    // youFuntionName 在DLL中声明的函数名
    if(youFuntionNameAlias)
    {
    CString a ;
    a.Format("%d",youFuntionNameAlias(10));
    MessageBox(a);
    }
    else
    {
    MessageBox("No");
    }
    }
        FreeLibrary(hDllInst);
    }
     
      

  4.   

        非常感谢楼上给我帮助,后来把对应的 KCPIDNO.dll 放到 c:/windows/system32 目录下, 对应动态库封装在 ActiveX 控件内,问题就OK了,让人很郁闷!!!!
         最后再用 javascript 调用 ActiveX 相关方法。现在整个项目已经验收了!
        非常非常感谢!