1 主cpp和.h都是为编写一个dll作的,原来我未添加另外2个函数实现的时候dll是正常可以被使用的。
2 cpp的内容都是函数,大部分是以类似short __declspec(dllexport) __stdcall修饰声明的,最后出现在classview里面的gloab文件夹下面
3 .h的内容是对应cpp中提供给外部使用的函数的声明。
4 我当时添加自己函数的时候,是首先在cpp中写的实现,然后在.h中写了声明,声明和实现都是参照原先正确的来作的。可是给delphi写的程序调用的时候说我后面加的两个函数无法定位输入点,不知道有人知道原因么

解决方案 »

  1.   

    怎么发了两个一模样的帖子?首先参考我在另一帖的回答。然后,你是动态调用还是静态调用?如果是在Delphi静态调用,当C++写的Dll有所改动以后,需要用borland提供的implib工具重新生成相应的lib文件,然后添加到Delphi工程中,重新编译一下。动态调用不存在这个问题,只要dll导出函数的格式相同,用GetProcAddress找到函数地址即可。
      

  2.   

    to ccrun(老妖)(www.ccrun.com):
    请问你说的delphi工具在哪里?因为两个地方就多点人看啊我应该是静态调用
    .cpp
      short __declspec(dllexport) __stdcall a()
    {
    }
    .h
      short __declspec(dllexport) __stdcall a();delphi中有个专门的接口单元类似这样的声明了
      function a:SmallInt; Stdcall external SDK_FILE name 'a';
      然后我使用就直接a();可是一运行就找不到输入点,其次对应dll的变化,我当时就按照接口单元里面的形式,添加了相应函数的声明
      

  3.   

    将C++中的函数声明加上extern "C" 修饰试试。
      

  4.   

    需要在def文件中导出函数否则delphi找不到入口点
      

  5.   

    to ccrun(老妖)(www.ccrun.com) :
    因为原来这样定义就没什么问题
    我只不过照着别人的代码添加了两个函数,按说不是声明这样细节的问题吧?
      

  6.   

    刚才搞混了。implib是C++Builder中提供的工具,Delphi不需要。
      

  7.   

    to pipi0714:
     怎么导出函数?请详细点好么?
      

  8.   

    添加了两个什么样的函数?把函数声明的原型贴出来loo一下。
      

  9.   

    to ccrun(老妖)(www.ccrun.com) :
      可是我看网上的示例基本都是将 lib变成dll啊?不知道怎么用了,我是新手,请给出具体的使用好么?3q了
      

  10.   

    .cpp
      short __declspec(dllexport) __stdcall a()
    {
    }
    .h
      short __declspec(dllexport) __stdcall a();原型就是如此,我那两个函数就是这样定义的啊不过参数我就没写出来了
      

  11.   

    lib变成dll?在哪里看到的神仙教程啊。.h
    extern "C" __declspec(dllexport) short __stdcall a();
    extern "C" __declspec(dllexport) short __stdcall b();.cpp
    short __stdcall a()
    {
    }short __stdcall b()
    {
    }Delphi中:
    function a: Shortint; stdcall; External 'YourDLL.dll';
    function b: Shortint; stdcall; External 'YourDLL.dll';
      

  12.   

    VC++的.lib有两种:一种是静态DLL,其中包括函数的实际代码,一种是有DLL生成的.lib,其中并不包含代码,只是包含DLL的链接信息。对于后一种比较简单,只需要使用C++ Builder中的命令行工具implib直接对DLL进行进行转换就可以了,不必理会VC++的.lib文件。但是前一种就很麻烦了,因为VC++和BCB的.lib格式差别很大,无法直接使用或转换。以前我也遇到过类似的问题,一个硬件厂商只提供了VC++的库文件,为了在BCB中使用,首先在VC++中建立一个DLL,添加若干函数,这些输出函数供BCB调用。在这些函数中调用.lib中的函数。这样BCB调用DLL中的函数,DLL中的函数再调用.lib中的函数,虽然麻烦些,但可以解决问题。
    用Program Files\Borland\CBuilder6\Bin\coff2omf.exe转换就了! 
        主持人注:coff2omf可以转换微软的COFF格式为Borland使用的OMF格式。但是这个工具有一些限制:转换一般的C函数还可以,转换C++类有困难;这个工具在处理新版本的VC++生成的库时可能有问题。 
        另外,可以参考“Using Visual C++ DLLs in a C++Builder Project”http://www.bcbdev.com/articles/vcdll.htm和http://www.bcbdev.com/articles/vcdll2.htm 
    据说VC的lib文件跟BCB不通用不过你也不用急啊,有dll文件可以自已生成lib文件滴implib filename.lib filename.dll就可以生成一个lib
    如果你有DLL的话可以用IMPLIB从DLL中生成符合BCB要求的LIB文件。也可以用COFF2OMF来转换LIB文件的格式。
      

  13.   

    to ccrun(老妖)(www.ccrun.com) :
    因为原来这样定义就没什么问题
    我只不过照着别人的代码添加了两个函数,按说不是声明这样细节的问题吧?
    老大我又重复一遍了,因为在我添加函数之前,其他能正常工作的函数都是类似我上面给的原型那样的声明的,所以我觉得不是声明的问题。
      

  14.   

    既然这样的话,检查一下你的def文件吧。
      

  15.   

    不过经过我仔细看,pipi0714可能说的对
    在那个def文件里面我没有写我添加的那两个函数
      

  16.   

    //
    // Note!
    //
    // If this DLL is dynamically linked against the MFC
    // DLLs, any functions exported from this DLL which
    // call into MFC must have the AFX_MANAGE_STATE macro
    // added at the very beginning of the function.
    //
    // For example:
    //
    // extern "C" BOOL PASCAL EXPORT ExportedFunction()
    // {
    // AFX_MANAGE_STATE(AfxGetStaticModuleState());
    // // normal function body here
    // }
    //
    // It is very important that this macro appear in each
    // function, prior to any calls into MFC.  This means that
    // it must appear as the first statement within the 
    // function, even before any object variable declarations
    // as their constructors may generate calls into the MFC
    // DLL.
    //
    // Please see MFC Technical Notes 33 and 58 for additional
    // details.
    //请问你的cpp文件中有没有这样的注释?