那个函数是一个COM事件的处理函数。
原型:(Delphi 风格)
TGSM2COMOnReceiveData = procedure(Sender: TObject; PackIndex: Integer;
var PackData: OleVariant; var Packdata1: OleVariant;Flag: Integer) of object;翻译成c++,大概是这个样子:(偶不会Delphi,呵呵)TGSM2COMOnReceiveData(Object Sender,//Object,一个万能的基类,和c#里Object不多一个样子。       
                      int PackIndex,
                      unsigned char* PackData,//or char* PackData
                      unsigned char* PackData1,//保留字段
                      int Flag);//保留字段因为这是一个事件处理函数,所以使用tlbImp之后,从对象浏览器中可以看到一个委托:
IGSM2COMEvents_OnReceiveDataEventHandler;
它具有(int,string,string,int)这样的函数签名。原COM的PackData中,包含如下的数据:
第0-13 字节: 为对方手机号码。数据格式为ASCII 的16 进制字符串。如:
‘3836………’ 表示  ‘86’。
第14 字节: 为短信长度。
第15-字串结束: 为短信内容。现在,PackData被.net包装成一个string,我又如何提取数据那?刚才做了试验,可以提取前13个字节,但是第14个字节将消失,同时第15个字节将被改变(第15个字节取代了第14字节的内容,并且和com接收到的第15字节有所不同)。

解决方案 »

  1.   

    我是这么看得。在原本之所以能够分析出什么是AscII字符,什么是Unicode字符串,用了一点技巧。
    通过COM结果传送的所有字符串都是WCHAR的String,可以看BSTR的定义,我不知道Delphi中是不是自己转换成二进制流的,反正VB之类的是不会自己干的,现在C#之类也不会自己干。我的建议是,把取到的字符串转换成为二进制流,然后再一个字节一个字节读。现在你读的数据不对,就是因为你直接拿到的数据就是WCHAR的字符串,63 00 64 00...这种东西,第14个当然是00,所以就没有了。
    从这个角度去分析试试看。