紧急求助:BCB中使用一个短信控件Sms1,但在执行Sms1->ConnectModem(wchar_t *,long)方法时总出现AV错误!!

hualianmao 2006-07-29 11:13:25
BCB6.0,导入了一个短信控件Sms1,据说此控件是用VB写的。
导入完成后在ActiveX栏中增加了一个手机图标,将此控件拖到Form1上,
根据Sms1控件的接口说明,要实现与接在串口的GSM Modem的连接,需调用ConnectModem(wchar_t *,long)方法,其中参数1为串口号(即COM1或COM2....),参数2为连接速率(如9600...),返回值若为1则说明连接成功,为0则不成功。

开始的时候对wchar_t类型不太了解,经查阅得知可通过如下方式由String得到wchar_t*:
wchar_t *wch=L"COM1";

因此,在Form1的OnShow事件中加入如下代码:

void _fastcall TForm1::FormShow(TObject *Sender)
{
if(Sms1->ConnectModem(L"COM1",9600)==1)
ShowMessage("成功");
else
ShowMessage("失败");
}

保存后编译成功。
但运行时问题出现了:每次执行到ConnectModem这一行时总会报错:Access violation at address 77EA9732,Read of address 00686000.

对于其中的wchar_t *类型的参数曾试用多种转换方式:
L"COM1"
WideString("COM1").c_bstr()
...
但问题依旧。

特请大家帮忙找一下原因,先致谢意!!
...全文
147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
daydayup234 2006-07-31
  • 打赏
  • 举报
回复
void _fastcall TForm1::FormShow(TObject *Sender)
{
if(Sms1->ConnectModem(WideString("COM1").Detach(),9600)==1)
ShowMessage("成功");
else
ShowMessage("失败");
}
daydayup234 2006-07-31
  • 打赏
  • 举报
回复
如果是BSTR
这个可能就解决了
WideString("COM1").Detach();


直接的wchar_t *与BSTR用法还是不一样
尽管
typedef /* [wire_marshal] */ OLECHAR *BSTR;
typedef WCHAR OLECHAR;
typedef wchar_t WCHAR;
rainfall19831109 2006-07-31
  • 打赏
  • 举报
回复
如果是数据类型不匹配的话在编译的时候就已经报错了。。。
既然编译通过了,就是环境的问题
还是那句。。。检查下初始环境。。。
YJS050320001 2006-07-30
  • 打赏
  • 举报
回复
还有出现:
Access violation at address 77EA9732,Read of address 00686000.
这样的错误,我觉得应该是数据类型不匹配的原因
也就是 COM1的类型不符合控件要求的关系。
YJS050320001 2006-07-30
  • 打赏
  • 举报
回复
你可以试一下这样:
void _fastcall TForm1::FormShow(TObject *Sender)
{ String a="COM1";
WideString b=a; //好像直接给b赋String型的数据是不行的
if(Sms1->ConnectModem(b,9600)==1)
ShowMessage("成功");
else
ShowMessage("失败");
}
rainfall19831109 2006-07-29
  • 打赏
  • 举报
回复
看看这控件在调用ConnectModern函数前还有没有些初始化的函数要执行。。。

另外,还可以尝试初始一下OLE和Com: OleInitialize()和CoInitialize()

我觉得就在你只写一句代码的情况下出现AV,一般都是因为某些地方没初始化引起的。。。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧