首页 新闻 会员 周边

C#调用dll ansi修饰问题

0
悬赏园豆:20 [待解决问题]

这是c#调用c++编写的dll时,类型对照。

Wtypes.h中的非托管类型  非托管 C语言类型        托管类名                说明 
LPSTR             
char*              System.String 或 System.StringBuilder   用 ANSI 修饰。

其中也说了,c++的参数 char* ,可以用c#的 string来传递,但是需要用ANSI修饰。

 

我的问题是,怎么用ANSI来修饰呢??

类似加特性那样??

 

棒槌联盟的主页 棒槌联盟 | 初学一级 | 园豆:167
提问于:2012-06-05 23:14
< >
分享
所有回答(1)
0

那是在C++的代码中编写,类似于:

void MyFunc(ANSI LPSTR param1)

具体的你要参考下相关文档。

到了.NET中,如果参数是只读的(输入参数),使用STRING就足够了,如果是需要有返回值的(引用、输出参数)则必须使用STRINGBUILDER。

无之无 | 园豆:5095 (大侠五级) | 2012-06-06 08:34

谢谢。

现在有个问题,是,输入参数在C++中 是LPStr 定义的,微软官方说用 string,并用 ANSI修饰,所以,我用ANSI修饰了,但是传入参数进去,还是不行。

我用C++去调用这个dll,就没有问题。郁闷了,主要是因为参数字符编码的问题,但是 在C#中,怎么也无法转换成Ansi的编码,总是 Unicode的。

 

[DllImport(@"e:\A.dll", CharSet = CharSet.Ansi)]
public static extern int a([MarshalAs(UnmanagedType.LPStr)] ref string contentOfLicense, [MarshalAs(UnmanagedType.LPStr)] ref StringBuilder outputBuffOfLicense, ref int lengthOfOutputBuff);

 

按理说定义的没有问题

支持(0) 反对(0) 棒槌联盟 | 园豆:167 (初学一级) | 2012-06-06 10:06

@幕后黑手-Boss: 不要加那个ref。

ref是引用。在被调用方修改变量的内容(应该说是修改变量指向的数据地址)。

虽然在C++中定义的参数是指针,但在.NET中,只需要直接使用string就好(string本身就是等同于一个lpstr的)。

只是,在C++定义中,把参数定义成LPCSTR和LPSTR是不同的(一个常量,一个变量),对应的.NET中,应该使用string和StringBuilder。

支持(0) 反对(0) 无之无 | 园豆:5095 (大侠五级) | 2012-06-06 10:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册