CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

原型为int _stdcall omrg(char * buf)的非托管DLL在C#里怎么调用?

楼主jouwei(九维)2006-03-14 15:16:24 在 .NET技术 / C# 提问

我现在是:  
  [DllImport("OmrUsb.dll",   EntryPoint="OmrG",   CharSet=CharSet.Auto)]  
  private   static   extern   int   uOmrG(StringBuilder   strBuf);  
  但是一调用uOmrG就卡住了。  
  我还试过用:  
  private   static   extern   int   uOmrG(String   strBuf);  
  private   static   extern   int   uOmrG(out   String   strBuf);  
  private   static   extern   int   uOmrG(ref   String   strBuf);  
  都是卡住!!!!  
  各位大侠帮个忙!!先谢谢了!! 问题点数:88、回复次数:15Top

1 楼jiezhi(风满袖)回复于 2006-03-14 15:25:55 得分 16

try:  
   
  [DllImport("OmrUsb.dll",   EntryPoint="OmrG",   CharSet=CharSet.ASCII)]  
  private   static   extern   int   uOmrG(string   strBuf);Top

2 楼lidong6(立冬)回复于 2006-03-14 15:39:40 得分 6

错误提示是什么?Top

3 楼jouwei(九维)回复于 2006-03-14 15:39:46 得分 0

jiezhi(风满袖)   :谢谢你的关注!  
  我查了文档,没发现CharSet.ASCII啊,是不是我的版本太低了?我用的VS2003。Top

4 楼jouwei(九维)回复于 2006-03-14 15:41:48 得分 0

lidong6(立冬):谢谢关注!  
  没有错误提示。一调用uOmrG程序就死掉。DLL是硬件跟过来的开发接口,不了解到底怎么回事。  
  还望费神,谢谢。Top

5 楼lidong6(立冬)回复于 2006-03-14 15:42:39 得分 20

有啊,CharSet.AnsiTop

6 楼kingdomgps(工作没激情)回复于 2006-03-14 15:55:18 得分 6

[DllImport("OmrUsb.dll",   EntryPoint="OmrG",   CharSet=CharSet.Auto)]  
            private   static   extern   int   uOmrG(byte[]   strBuff);  
  用这个试试,调用的时候直接传byte[]进去就行了,前提是你传进去的byte[]足够放得下strBuff,否则会报CLR运行错误  
  Top

7 楼tiaoci(我挑刺,我快乐)回复于 2006-03-14 15:55:51 得分 6

你调用前StringBuffer有分配化空间吗?  
   
  这样申明:  
  [DllImport("OmrUsb.dll",   EntryPoint="OmrG")]  
  private   static   extern   int   uOmrG(StringBuilder   strBuf);  
   
  这样调用:  
  StringBuffer   buf   =   new   StringBuffer(1024);  
  uOmrG(buf);Top

8 楼jouwei(九维)回复于 2006-03-14 16:06:51 得分 0

lidong6(立冬):改成CharSet.Ansi同样出错。  
  kingdomgps(工作没激情):谢谢,你的方法我试了,还是没卡住。  
  tiaoci(我挑刺,我快乐):我的StringBuffer有分配空间,而且有试过设置Length,还是不行。Top

9 楼kingdomgps(工作没激情)回复于 2006-03-14 16:09:57 得分 10

这个不行?  
  那你试试  
  [DllImport("OmrUsb.dll",   EntryPoint="OmrG",   CharSet=CharSet.Auto)]  
            private   static   extern   int   uOmrG(ref   byte   strBuff);  
  调用的时候这样  
          byte[]   strBuff   =   new   byte[1024];  
          uOmrG(ref   strBuff[0]);  
  看看行不Top

10 楼kingdomgps(工作没激情)回复于 2006-03-14 16:24:05 得分 6

我想我找到问题了,你改成这样子看看  
  [DllImport("OmrUsb.dll",   EntryPoint="OmrG",   CharSet=CharSet.Auto,CallingConvention   =   CallingConvention.StdCall)]  
            private   static   extern   int   uOmrG(byte[]   strBuff);  
  好象默认的调用方式是WinApiTop

11 楼jouwei(九维)回复于 2006-03-14 16:36:04 得分 0

谢谢大家的意见!  
  问题已经解决。关键在在于CharSet必须要设置为ANSI。  
  以下是微软的说明:  
  Wtypes.h   中的非托管类型:LPSTR  
  非托管   C   语言类型:char*  
  托管类名:System.String   或   System.StringBuilder  
  说明:用   ANSI   修饰。    
  具体文档见:  
  http://msdn2.microsoft.com/zh-cn/library/ac7ay120(VS.80).aspx  
  Top

12 楼jouwei(九维)回复于 2006-03-14 16:36:50 得分 0

结贴!Top

13 楼s5689412(华君)回复于 2006-03-14 16:37:34 得分 6

P/Invoke默认的调用方式是WinApi,其实也就是StdCall。  
   
  这个问题的关键应该是在那个参数如何传递上,其实char   *这样的写法不太严密,  
  不过如果非要用char   *,而且函数内部不修改指针的内容,可以把你的参数声明为  
  [Marshalas(UnmanagedType.LPStr)]  
  String   strBuf  
  看看,如果要修改的话,用  
  [Marshalas(UnmanagedType.LPStr)]  
  StringBuilder   strBuf  
  试试看,注意先给strBuf分配足够的空间。  
  Top

14 楼tiaoci(我挑刺,我快乐)回复于 2006-03-14 18:04:50 得分 6

char   set   默认就是ansi的吧?  
   
  用于   C#   和   Visual   Basic   的默认枚举成员为   CharSet.AnsiTop

15 楼s5689412(华君)回复于 2006-03-16 09:33:32 得分 6

CharSet的默认值应该是Auto,和操作系统有关。  
   
  针对目标操作系统适当地自动封送字符串。在   Windows   NT、Windows   2000、Windows   XP   和   Windows   Server   2003   系列中默认为   Unicode;在   Windows   98   和   Windows   Me   中默认为   Ansi。Top

相关问题

  • char *a="abc"和char c[4]="abc"的区别
  • char c-style 的转换。。
  • c#中string[] 转化成char*
  • 寻找char**的C++替代
  • 原来char c=70和char c='\u0070'有区别的
  • .NET CHAR[] 向 C++ TCHAR* 传递参数?
  • C++中 char VersionMessage[40];在C#中怎么写?
  • C语言中的char**在C#中是什么类型?
  • s:string; c:char; 如果s:='abcd',怎样令c等于s的第3个字符,即'c'
  • 如何将char a[100]分成char b[50],c[50]??

关键词

  • c#
  • dll
  • omrg
  • 调用
  • omrusb
  • strbuf
  • uomrg
  • 托管
  • charset
  • strbuff

得分解答快速导航

  • 帖主:jouwei
  • jiezhi
  • lidong6
  • lidong6
  • kingdomgps
  • tiaoci
  • kingdomgps
  • kingdomgps
  • s5689412
  • tiaoci
  • s5689412

相关链接

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

广告也精彩

反馈

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