mciSendCommand函数每次都调用失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mciSendCommand函数每次都调用失败相关的知识,希望对你有一定的参考价值。

本来是要用c语言编写一个控制台应用程序下的MP3播放器。用的是mci。环境是vs2010。
可是每次调用mciSendCommand都调用失败,返回值为263。用mciGetErrorString()查看错误信息全是乱码。
如下是出问题的代码
MCI_OPEN_PARMS mciOpen;
MCIERROR mciError;

mciOpen.lpstrDeviceType =(LPCWSTR)"mpegvideo";

mciOpen.lpstrElementName =(LPWSTR) "d:\\a.mp3";

mciError = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mciOpen);
if(mciError)

mciGetErrorString(mciError,(LPWSTR)buf,128);
printf("send MCI_OPEN command failed:%s\n",buf);
return;


声明的头文件有
#include "stdafx.h"
#include<Windows.h>
#include<MMSystem.h>
#include <Digitalv.h>
#include <vfw.h>
#pragma comment(lib,"vfw32.lib")
#pragma comment(lib,"Winmm.lib")

跪求大神,跪求大神,跪求大神
暂时找到原因了,由于在vs2010下,不能给mciOpen的成员直接赋予字符串。于是我再在下面的代码中,我把字符串强制转换了。结果导致了最终无法运行。
mciOpen.lpstrDeviceType =(LPCWSTR)"mpegvideo";
mciOpen.lpstrElementName =(LPWSTR) "d:\\a.mp3";
之后改变为TEXT,如下所示,便可以正常运行了。
mciOpen.lpstrDeviceType =TEXT("mpegvideo");
mciOpen.lpstrElementName =TEXT( "d:\\a.mp3");
这是为什么,为什么会有这样的结果。TEXT到底是什么?
还有如果我之后赋值的不是字符串,是字符指针,又有什么办法解决。

关于 TEXT() 和 _T(),是把普通字符串常量(以 const char 为单元)变成以 const TCHAR 为单元的字符串常量。TCHAR 在非 Unicode 情况下被定义为 char,而在 Unicode 情况下被定义为 wchar_t ,就是宽字符。宽字符在 vc 上占两个字节。现在 vc 上创建的工程一般默认是 Unicode 的,所以 TCHAR 是宽字符,你的代码就会有编译错误。把你代码里所有 char 改成 TCHAR 就好了。字符串常量都加 _T() 或者 TEXT() ,#pragma 里的就算了。
字符指针的类型不用 char* 和 const char*,换成 TCHAR* 和 const TCHAR* 就可以了。
参考技术A 这个是使用字符集的问题,如果不想使用TEXT宏的话,把工程属性里面设置字符集为《使用多字节字符集》,有关字符集的问题,可以从网上查找《windows程序设计》这本书,里面应该介绍的还算详细

React:每次渲染都会调用 onClick 处理程序?

【中文标题】React:每次渲染都会调用 onClick 处理程序?【英文标题】:React: onClick handler is getting called on every render? 【发布时间】:2017-05-31 23:57:54 【问题描述】:

我在学习React,跟着this tutorial做了一个简单的井字游戏,你可以view here in CodePen.

我对箭头函数在 Square 组件的 onClick 属性中的工作方式感到困惑,该属性在 Board 组件的 renderSquare 函数内部返回:onClick=() =&gt; this.props.onClick(i)。同样也是我拥有onClick= (i) =&gt; this.handleClick(i) 的游戏组件。我以为我可以在没有箭头函数的情况下编写它(就像onClick=this.handleClick(i)),但这会破坏游戏。

【问题讨论】:

粗略解释:onClick 采用在事件触发时执行的函数。当() =&gt; this.foobar(blah) 完成时,创建一个箭头函数,它使用参数blah 执行foobar。你不能做this.foobar(blah) 的原因是因为它会执行函数并传递返回值。 onClick 需要一个函数执行,而不是一个值。 看到这个:***.com/questions/29810914/… 您可能还想阅读facebook.github.io/react/docs/handling-events.html 【参考方案1】:

onClick 需要一个函数。箭头函数没有自己的this;使用封闭执行上下文的this 值。 箭头函数是以下的替代品

onClick=this.handleClick.bind(this,i)

当你运行它时它不起作用

onClick=this.handleClick(i) 

因为在这种情况下,它将调用一个函数,并且该函数将传递一个返回值,该返回值将在每次调用 render 时进行评估。因此,如果您在 onClick 函数中执行导致重新渲染的操作,例如 setState,您的应用程序将陷入无限循环。因此onClick 需要一个函数而不是一个值,所以除非你从onClick 处理程序返回一个函数,否则你不应该直接调用它。

上面的箭头函数起到了将参数绑定到函数的作用

【讨论】:

我认为如果不知道handleClick 里面是什么,就无法得出这个结论,它还不如给你一个新的函数回调作为一个值。当然它适合这个问题,但它真的取决于handleClick 函数在做什么 @Icepickle,是的,你是对的,这是我的一个旧答案,没有那个解释,我正在编辑它,提供更多细节。

以上是关于mciSendCommand函数每次都调用失败的主要内容,如果未能解决你的问题,请参考以下文章

如何用mciSendCommand()/mciSendString() 函数指定声卡播放音乐

每次第一次调用时,适配器调用都会失败(超时)

新手行货iphone 4.2.1 mc603ch 想升4.33 和越狱 求升级 越狱 备份SH 步骤 那步先???

Mathematica中用Needs调用外部程序包时失败?

MciSendCommand无法播放(打开)同一个文件两次

Android 上的 C++ 代码 - execl() 函数调用失败