CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

请高手回答,关于BCB动态调用vc编写的DLL的函数类型转换问题

楼主hunter200407()2006-06-04 03:30:35 在 C++ Builder / 基础类 提问

本人用vc6编了DLL,已经用vc6做测试程序调通,bcb是初学,需要用来做界面,用动态的显式链接方法(Loadlibrary。。。),不过在bcb测试时无法发通指令,不知是不是因为bcb没有CString,而出现的类型转换问题  
  //dll函数  
  bool   StartListen(char*   ComName)  
        {  
          }  
  CString   ConnectTogether(int   MonitorNo,   int   CameraNo)  
        {  
          }  
   
   
   
  //bcb代码,(.cpp)中  
   
  typedef   bool   (*   open)(char   *);  
  typedef   LPCTSTR   (*   check)(int,int);  
  FARPROC   lpFarProc;             //指向dll模块中函数地址的指针  
  int   (*lpaddit)(int,int);                   //自己声明的一个和dll中的函数一样功能的函数原型  
   
  TForm1   *Form1;  
  //---------------------------------------------------------------------------  
  __fastcall   TForm1::TForm1(TComponent*   Owner)  
                  :   TForm(Owner)  
  {  
  }  
  //---------------------------------------------------------------------------  
  HINSTANCE   DLLInst   =   NULL;  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
                  bool   r;  
                  open   p;  
                  char   result;  
   
                  DLLInst   =   LoadLibrary("ComServer.dll");  
   
   
                  p   =   (open)GetProcAddress(DLLInst,"StartListen");  
          if(p!=NULL)  
  {  
  r   =   p("COM1");  
                                  ShowMessage("ok");  
  if(r)  
    {       lpFarProc   =   GetProcAddress(DLLInst,"ConnectTogether");  
                  if(lpFarProc!=NULL)  
                  {  
                                                  lpaddit   =   (int(_cdecl   *)(int,   int))lpFarProc;   //指针类型转换  
   
  result   =     lpaddit(1,2);  
                                                  ShowMessage("connect   com");  
                  }  
                                  else  
                                ShowMessage("not   com");  
                                  }  
                      }  
                  else   ShowMessage("Could   not   obtain   function   pointer");  
   
   
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::Button2Click(TObject   *Sender)  
  {  
              FreeLibrary(DLLInst);  
  }  
   
  出错提示信息是("not   com"),说明StartListen命令没有得到COM的值,希望高手指点,谢谢  
   
   
  如果我改为如下情况,返回的虽然是("okcom");不过没有指令代码  
   
   
  HINSTANCE   DLLInst   =   NULL;  
   
  void   __fastcall   TForm1::Button1Click(TObject   *Sender)  
  {  
                  bool   r;  
                  open   p;  
                  DLLInst   =   LoadLibrary("ComServer.dll");  
                  p   =   (open)GetProcAddress(DLLInst,"StartListen");  
          if(p!=NULL)  
  {  
  r   =   p("COM1");  
                                  ShowMessage("ok");  
  if(r)  
    {  
                                  ShowMessage("okcom");  
                                  }  
                      }  
                  else   ShowMessage("Could   not   obtain   function   pointer");  
   
  }  
  //---------------------------------------------------------------------------  
  void   __fastcall   TForm1::Button2Click(TObject   *Sender)  
  {  
              FreeLibrary(DLLInst);  
  }  
  //---------------------------------------------------------------------------  
   
   
   
  希望能帮忙把两个函数都给调通,谢谢了  
  问题点数:80、回复次数:4Top

1 楼rainfall19831109(恩恩)回复于 2006-06-04 03:42:25 得分 0

本人认为,一个工具写出来的DLL提供给别的工具调用,使用的数据类型应以COM数据类型为好  
   
  函数StartListen,返回值建议使用BOOL而不要使用bool,我未试过用bool作为dll的返回值,所以不敢确定用bool是否会有错,但我一直用BOOL写DLL,在别的工具上多可以使用得好好的]  
   
  至于函数ConnectTogether更不用说啦,MFC的字符串类CString放到BCB上用.试下改回char   *或者LPTSTR类型作为字符串作为返回值Top

2 楼rainfall19831109(恩恩)回复于 2006-06-04 18:24:48 得分 0

补充一下  
   
  因为VC编写的DLL的LIB文件格式是coff格式,而BCB使用的格式是omf,因此,如果该DLL是静态调用的话,还必须使用BCB安装目录下的bin目录的的coff2omf.exe,对coff格式的LIB文件转换一下  
  coff2omf.exe   coff.lib   omf.libTop

3 楼i_love_pc(杰子)(欢迎加入技术交流QQ群:23640432)回复于 2006-06-05 08:54:52 得分 0

顺便问一下,coff2omf.exe工具是不是可以转换vc写的静态连接库lib文件呢,我试过几次可是转换之后文件大小明显减小,而且调用时出错.请高手指点.Top

4 楼weixing979(★★★闪电侠★★★)回复于 2006-06-05 09:01:09 得分 0

不用CString   ,用   char   *Top

相关问题

关键词

得分解答快速导航

  • 帖主:hunter200407

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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