PInvoke mciSendString

时间:2013-12-05 08:53:02

标签: c# .net winapi pinvoke dllimport

我正在尝试使用此功能(它需要),所以我正在编写这样的代码:

    [DllImport("winmm.dll")]
    private static extern long mciSendString(string strCommand, StringBuilder strReturn, int iReturnLength, IntPtr hwndCallback);
    private static void OnEvent(MyEvent ev)
    {
        string sound = Path.Combine(SoundFolder, ev.SoundName) + ".mp3";
        var command = string.Format("open {0} type mpegvideo alias sound", sound);
        mciSendString(command, null, 0, IntPtr.Zero);
        mciSendString("play all", null, 0, IntPtr.Zero);
        new NotificationPage(ev).Show();
    }

但它不会播放任何内容,即使是带有硬编码路径的文件也是如此。我做错了什么?


补充:我改写了使用int的方法,如果长的话。 但它仍然无法正常工作。 即使是简单的代码:

    public MainWindow()
    {
        InitializeComponent();
        string sound = Path.Combine(SoundFolder, "NormalPriority") + ".mp3";
        if (!File.Exists(sound))
            throw new FileNotFoundException();
        var command = string.Format("open {0} type mpegvideo alias sound", sound);
        mciSendString(command, null, 0, IntPtr.Zero);
        mciSendString("play all", null, 0, IntPtr.Zero);
    }

所以这是一个WPF应用程序

原来它看起来像

    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        _notificator = new Notificator(Directory.GetCurrentDirectory());
        _notificator.EventStarted += (o, ev) => Dispatcher.Invoke(() => OnEvent(ev));
    ...

我是在C ++ 2上写的

#include <windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")
#include <string>


int main()
{
    int res = mciSendString(L"open D:\\song.mp3 type mpegvideo alias sound", NULL, 0, 0);
    printf("%i", res);
    return 0;
}

同样的错误277

1 个答案:

答案 0 :(得分:2)

p / invoke有一个我能看到的错误。返回值应为intuint,因为MCIERROR是32位整数。在C#long中是64位宽。

除此之外,你打电话mciSendString的方式还不错。实际上,即使使用错误的返回类型声明,您的代码在运行时也能正常播放mp3文件。

那么,为什么它会失败呢?最明显的原因是多媒体功能依赖于消息循环的存在。调用此代码的线程可能不会为消息队列提供服务。你是从控制台应用程序进行调用吗?

如果线程确实有一个消息队列,并正确地泵送它,那么我不确定还有什么建议。下一步是执行一些您目前不执行的错误检查。记下mciSendString返回的值,看看它们是否表示错误。


您现在发现mciSendString正在返回错误代码MCIERR_INTERNAL。对我来说,听起来你的问题是环境问题。您的代码非常适合我,因此您的音频设置/驱动程序出现问题或.mp3文件出现问题。但是我们无法做更多的事情来帮助您处理代码,因为问题不在您的代码中。