CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

C# 调用 API调用成功但是结果不对,请高手指教

楼主hahawuwu()2005-05-10 10:22:07 在 .NET技术 / C# 提问

C++编写的API  
  头文件为  
  extern   "C"    
  {  
  __declspec(dllexport)   char*   PinJie(char*   pA,   char*   pB);  
  }  
  CPP中的函数为,目的是连接连个字符串  
  char*   PinJie(char*   pA,   char*   pB)  
  {  
  int   nA   =   strlen(pA);  
  int   nB   =   strlen(pB);  
  int   nOut   =   nA   +   nB;  
  char*   pOut   =   new   char   [nOut   +   1];  
  if(pOut   !=   NULL)  
  {  
  memcpy(pOut,   pA,   nA);  
  memcpy(pOut   +   nA,   pB,   nB);  
  pOut[nOut]   =   0;  
  }  
  return   pOut;  
  }    
   
   
  我在C#中是这样调用的  
   
  using   System.Runtime.InteropServices;  
   
  namespace   ImportDll  
  {  
  ///   <summary>  
  ///   WebForm1   的摘要说明。  
  ///   </summary>  
  public   class   WebForm1   :   System.Web.UI.Page  
  {  
  [DllImport("PinJie.dll",ExactSpelling   =   true,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]  
  unsafe   public   static   extern   char*   PinJie(char*   a,   char*   b);  
   
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
  unsafe  
  {  
  char   str_a   =   '1';  
  char   str_b   =   '2';  
  char*   chr_a   =   &str_a;  
  char*   chr_b   =   &str_b;  
   
  Page.Response.Write(*PinJie(chr_a,chr_b));  
  }  
  }  
  }  
  }  
   
  我想返回的结果是12也就是字符串连接,但是现在返回的东西比较怪异不知道为什么在哪里,请高手指教 问题点数:100、回复次数:10Top

1 楼hahawuwu()回复于 2005-05-10 10:35:31 得分 0

自己顶一下,高手出招吧Top

2 楼yuqingjiang()回复于 2005-05-10 10:42:56 得分 0

WebForm中的跨平台调用受限制Top

3 楼hahawuwu()回复于 2005-05-10 10:45:31 得分 0

那也就是说我这样做不可以吗?Top

4 楼qiezic(破晓)回复于 2005-05-10 10:48:01 得分 0

markTop

5 楼hahawuwu()回复于 2005-05-10 10:52:31 得分 0

再顶一下吧,受不了了,都弄了一天了  
  1:27916432  
  2:27916428  
  ㈱:207490192    
  这个是我执行的结果,后面的数是地址Top

6 楼sayo(你敢笑我?!信不信我娶你!)回复于 2005-05-10 10:57:32 得分 100

尝试使用如下代码:  
  [DllImport("PinJieDll.dll",   ExactSpelling   =   true,   CharSet   =   CharSet.Ansi,   CallingConvention   =   CallingConvention.StdCall)]  
  public   static   extern   string   PinJie(string   a,   string   b);  
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
          Page.Response.Write(PinJie("1",   "2"))  
  }Top

7 楼sayo(你敢笑我?!信不信我娶你!)回复于 2005-05-10 10:59:11 得分 0

上面的PinJieDll.dll应改为PinJie.dll,不好意思Top

8 楼hahawuwu()回复于 2005-05-10 11:06:12 得分 0

谢谢sayo我的问题解决了!Top

9 楼yuqingjiang()回复于 2005-05-10 11:20:36 得分 0

对不起我的回答太简单了。看你程序中的调用,应该不会受限。  
  跨平台调用最要注意的就是参数的大小,  
  你用   sizeof看一下char的长度,比较一下在你dll   中sizeof(str_a)的长度可能会出现16位和8位的区别。这个时候你就要转换byte在C#里是8位的。  
  另外,尽量使用标准跨平台调用。  
  [DllImport("PinJie.dll",CharSet=CharSet.Auto]  
  public   static   extern   IntPtr   PinJie(IntPtr   a,   IntPtr   b);  
   
  char   aa   =   '1';  
  char   bb   =   '2';  
   
  IntPtr   ca   =   IntPtr.Zero;  
  Marshal.WriteInt16(pa,aa);//Marshal.WriteByte(pa,aa);  
   
  Top

10 楼beijingbeerman(啤酒肚)回复于 2005-08-14 07:48:38 得分 0

试试这个代码:  
  [DllImport("PinJieDll.dll",     CharSet   =   CharSet.Ansi,   CallingConvention   =   CallingConvention.StdCall)]  
  public   static   extern   string   PinJie(string   a,   string   b);  
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
          Page.Response.Write(PinJie("1",   "2"))  
  }  
  Top

相关问题

  • C# 调用 API调用成功但是结果不对,请高手指教
  • C#如何调用API??
  • C#调用Windows API问题
  • C# 如何调用Win32 API?
  • C#调用API的问题!
  • C# 调用API (DsBrowseForContainer)问题
  • C#调用BCB写的dll不成功
  • c/c++如何调用google API?
  • C调用C#?
  • c中能调用API函数吗?

关键词

  • c#
  • pb
  • dll
  • pinjie
  • 调用
  • pout
  • callingconvention
  • pinjiedll
  • nout
  • intptr

得分解答快速导航

  • 帖主:hahawuwu
  • sayo

相关链接

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

广告也精彩

反馈

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