CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

C++Builder怎样调用C#作的DLL啊?

楼主WYJBCB(阿菜)2003-09-02 08:40:04 在 .NET技术 / C# 提问

最好能给一个例子. 问题点数:50、回复次数:13Top

1 楼COKING(天晴)回复于 2003-09-02 09:08:29 得分 0

你你你?Top

2 楼WYJBCB(阿菜)回复于 2003-09-02 09:38:53 得分 0

楼上的兄台,不知何意?Top

3 楼Iamsnowgirl(snowgirl)回复于 2003-09-02 11:18:51 得分 6

动态连接库(dll)的调用主要有两种方式:隐式链接和显式链接。隐式  
  链接是常用方式。  
   
    如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入  
  库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains   invalid   OMF   record。例如在C++Builder开发平台上链接Visual   C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。  
   
    显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。  
   
    步骤:  
   
    1.   调用LoadLibrary函数装载DLL并得到模块句柄;  
   
    2.   调用GetProcAddress函数获取指定导出函数的指针;  
   
    3.   用这个函数的指针调用该函数;  
   
    4.   使用完毕后,用FreeLibrary释放DLL。  
   
    例子:  
   
    用VC++制作一个动态库:  
   
    选new→Project→Win32—Dynamic—Link   Library,加入addit.cpp  
   
    extern   ″C″  
   
    {   void   —declspec(   dllexport   )   addit(int   a,   int   b,   int   *c)  
   
    {   *c   =   a   +   b;    
   
       }  
   
    }  
   
    addit.h  
   
    extern   ″C″  
   
    {void   addit(int   a,   int   b,   int   *c);}  
   
    编译链接生成addit.dll和addit.lib。在C++Builder程序中调用addit函数。  
   
    C++Builder程序中:  
   
    {HINSTANCE   handle;   //DLLa模块的句柄  
   
       FARPROC   lpFarProc;    
   
    void   (*lpaddit)(int,int,int   *);  
   
  //指向addit函数的指针  
   
    int   ntemp;  
   
    handle   =   LoadLibrary(″addit.dll″);    
   
    //装载addit.dll,   得到该库句柄  
   
    //addit.dll位于当前目录下  
   
    lpFarProc   =   GetProcAddress(handle,″addit″);    
   
    //得到指向函数addit的指针  
   
    lpaddit   =   (void(—cdecl   *)(int,   int,   int   *))lpFarProc;   //指针类型转换  
   
    lpaddit(2,3,&ntemp);   //使用addit函数  
   
    FreeLibrary(handle);    
   
    //将addit.dll从程序中卸掉  
   
    }  
   
    此程序在VC++   5.0   和C++Builder   3.0下通过。  
   
    使用C++Builder中提供的导入库生成工具:先预处理,后隐式链接。  
   
    步骤:  
   
    1.用C++Builder提供的implib.exe工具重新生成该动态库(xxx.dll)的导入库(xxx.lib)。命令如下:  
   
    implib   addit.lib   addit.dll。  
   
    addit.dll为已有动态库,addit.lib为要生成的导入库。由此生成的导入库addit.lib格式与C++Builder开发平台是相容的;  
   
    2.在动态库的头文件addit.h中,对其输出函数重新说明,语句如下:  
   
       extern   —stdcall   void   addit(   int   a,   int   b,   int   *c);  
   
    3.然后采用隐式链接法,将重新生成的导入库(addit.lib)和重新说明的头文件(addit.h)加入到C++Builder应用程序的工程项目中,进行编译和连接。  
   
    addit.dll按上述步骤操作,在VC++   5.0   和C++Builder   3.0下通过。  
  Top

4 楼WYJBCB(阿菜)回复于 2003-09-02 11:30:56 得分 0

To   Iamsnowgirl(snowgirl)    
  谢谢,不过这篇文章我也有,他对C#的调用好像不行.Top

5 楼yhz(耗子)回复于 2003-09-02 20:13:48 得分 6

不要随便用C#写DLL。  
   
  因为它生成的是托管代码。要装.net   freamework(是这么写的吧?)  
  用   VC.net   写   DLL   的时候,还是选择静态   MFC   DLL,比较好。  
   
  如果你确认你的调用没有问题,我想很可能是这个问题。Top

6 楼zjqyb(风清扬*任它溺水三千,我只取一瓢饮*)回复于 2003-09-02 20:33:24 得分 6

要C++Builder7.0以上才能  
  调用C#作的DLLTop

7 楼ThinkX(秋天的树)回复于 2003-09-02 20:56:31 得分 6

我想也许你可以用VC.NET包装一下,不过无论如何你的程序都脱不开.NET   FrameworkTop

8 楼Behard(我爱天安门)回复于 2003-09-03 09:11:01 得分 3

没有   VC.net   没有权利发言Top

9 楼hongliqiu(在火中)回复于 2003-09-05 09:40:11 得分 3

不知道,听课来了。Top

10 楼wenyongjie(我们的目标是:没有蛀牙!!)回复于 2003-09-05 09:55:10 得分 0

我作了一下,没有成功,现把代码帖出,各位看下有哪些要改一下!  
  这是C#的DLL  
  using   System;  
   
  namespace   CBDLL  
  {  
  ///   <summary>  
  ///   Class1   的摘要说明。  
  ///   </summary>  
  public   class   Class1  
  {  
  public   Class1()  
  {  
  //  
  //   TODO:   在此处添加构造函数逻辑  
  //  
  }  
  public   string   test(string   str)  
  {  
  return(str);  
  }  
  }  
  }  
  CB   动态调用  
  private: //   User   declarations  
  String   (__stdcall   *test)(String   str);//声明  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)//双击Button1调用  
  {   HINSTANCE   DLLInst   =   NULL;  
      String   s;  
      if(   NULL   ==   DLLInst   )   DLLInst   =   LoadLibrary("CBDLL.dll");   //上面的   Dll  
          if   (DLLInst)   {  
                  test=(String   (__stdcall*)(String   str))   GetProcAddress(DLLInst,"_test@0");  
                    if   (test)  
                      {   s=test(Edit1->Text);       ShowMessage(s);       }  
                  else   ShowMessage("不能取得函数test指针");  
          }  
          else   ShowMessage("加载CBDLL.dll错误!");  
          FreeLibrary(DLLInst);  
  }  
   
  出现如下提示:   不能取得函数test指针Top

11 楼yhz(耗子)回复于 2003-09-28 15:54:18 得分 6

你用   depends   去检查一下你的   test   的名字还是不是   test   ???  
   
  我现在手头上没有   VC.net,不过我估计在编译的时候,编译器把输出名字改了。  
   
  或者你在   DLL   的输出函数里面加上   __stdcall   试试看?Top

12 楼zhouzhouzhou(人生程序)回复于 2003-09-28 16:23:10 得分 3

不是吧,  
   
  暈Top

13 楼storm97(风暴不再)回复于 2003-09-28 18:37:32 得分 11

http://www.csdn.net/develop/article/21/21259.shtmTop

相关问题

  • 简单调用DLL函数C++ Builder !
  • C++ Builder中如何调用VC++编写的.dll?
  • 如何在DELPHI中调用C++ BUILDER写的DLL文件?
  • 用C++Builder开发的DLL怎样在Delphi中调用?
  • C++ Builder 如何调用动态连接库(*.DLL)中的函数
  • C++ Builder中调用delphi做的dll的问题
  • 在PB中如何调用C++Builder开发的DLL
  • 关于C++ Builder中 调用DLL的问题?
  • delphi下的dll如何改到c++builder下调用???
  • vb的dll如何在c++builder中调用?

关键词

  • .net
  • c#
  • c++builder
  • 函数
  • 动态库
  • 指针
  • 应用程序
  • 开发平台
  • 文件
  • 连接

得分解答快速导航

  • 帖主:WYJBCB
  • Iamsnowgirl
  • yhz
  • zjqyb
  • ThinkX
  • Behard
  • hongliqiu
  • yhz
  • zhouzhouzhou
  • storm97

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo