原型为int _stdcall omrg(char * buf)的非托管DLL在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




