昨天给公司封装一个商业组件(一个dll)成.net组件,以方便同事使用.商业组件用VC6开发,所以我开始并没有多想,直接新建了一个.net下的类库项目.用DllImport来引用.这里开始还遇到一个小插曲,组件提供商提供的dll函数居然是错误的,所以最开始郁闷了好久,总是调用不到函数,后来用Depends一查看,我KAO,居然给的函数名全是错的.
本以为接下来会很顺利,可是这个组件的开发者可不那么想.最开始的几个函数调用都是只包含bool,int等基本数据类型,调用没有问题,忽然看到函数申明里出现一个参数,CString.我大汗,这是MFC里的数据类型啊...怎么会用这个来做输入输出参数,郁闷.
没办法,硬着头皮试了几次,不管是用string还是StringBuilder都不行,返回乱码...只好到处查查相关资料了,其中使用了许多,比如使用IntPtr类型,换编码方式等,最后都是失败...
在资料中看到托管和非托管数据类型的转换中,string和StringBuilder对应的为char*,立刻就想,要把CString类型转换为char*就好了,不过这个组件是第三方的,继续郁闷...最后没招了,在中间再挂接一个临时Dll,使用VC6写了个dll专门与原始的dll进行影射操作,所不同的是,这里暴露给外部的参数里, CString都变为了char*.转换的代码如下:
char* str = word.GetBuffer(word.GetLength());//word为CString类型
试验,结果继续失败...
到这一步,由于我过于看重大的方向,觉得方向是没错的,无论如何想不出到底错在哪,最后多谢CSDN的Knight94朋友,告诉我我的转换出错了,应该使用
char* str = new char[word.GetLength()];
strcpy(str,word.GetBuffer(word.GetLength()));
原因是我的方式虽然一般情况下可以得到值,但是指针引用的依然是CString的地址,下面的方法new了新地址,在值拷贝,就没问题了:)
虽然其中一波三折,不过最后总算解决了问题,总结起来,问题的起因就是这个商业组件的开发者的态度过于随意引起的(文档不严谨,使用不合适的数据类型),我自己在解决问题的过程中,对于细节太忽略了,导致在一个简单问题上浪费了许多时间,希望大家吸取教训.