• .net组件调用VC组件时的数据类型问题.


    昨天给公司封装一个商业组件(一个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了新地址,在值拷贝,就没问题了:)

    虽然其中一波三折,不过最后总算解决了问题,总结起来,问题的起因就是这个商业组件的开发者的态度过于随意引起的(文档不严谨,使用不合适的数据类型),我自己在解决问题的过程中,对于细节太忽略了,导致在一个简单问题上浪费了许多时间,希望大家吸取教训.

  • 相关阅读:
    NGINX location 在配置中的优先级
    CentOS 系统启动流程
    微软输入法正则bug
    uniapp改变页面背景色
    路由Router
    vue-cli3替换默认的title和图标(区别脚手架vue-cli2版本)
    浏览器报错 Refused to apply style from 'http://******' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
    禁止浏览器后退
    前端构建工具(webpack-gulp-grunt-rollup...)
    鼠标经过小箭头(状态伪类需求)
  • 原文地址:https://www.cnblogs.com/wuxilin/p/386235.html
Copyright © 2020-2023  润新知