导入" winmm.dll"时出现DllNotFoundException在WP8.1中

时间:2014-08-23 00:36:47

标签: c# windows-phone-8 pinvoke

我试图在WP8.1应用上导入winmm.dll以尝试控制设备音量。基于谷歌的研究,我创建了一个Windows运行时组件来包装实际的函数调用,然后我从主应用程序调用它。由于问题显然在包装器中,因此代码为:

public sealed class VolumeControl
{
    [DllImport("winmm.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
    internal static extern int waveOutSetVolume(IntPtr uDeviceID, int dwVolume);

    public static void Set(int volume)
    {
        // get volume as proportion of maximum
        double newVolume = ushort.MaxValue * volume / 10.0;

        // convert this into volume for two channels
        uint v = ((uint)newVolume) & 0xffff;
        uint vAll = v | (v << 16);

        // set volume
        waveOutSetVolume(IntPtr.Zero, (int)vAll);
    }

我还在包装器的项目属性中启用了不安全的代码。据我所知,在WP8.1中本地库可以使用DllImport。我不希望此应用在Windows应用商店中通过认证,但我仍然无法理解为什么此代码无法在开发者解锁的设备上运行。

不知道我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:1)

在Windows Mobile上,所有波形音频功能都在'coredll.dll'中实现。使用此DLL而不是'winmm.dll'。

答案 1 :(得分:0)

documentation有答案:

  

<强>要求

     

受支持的最低客户端   Windows 2000 Professional [仅限桌面应用程序]

换句话说,Windows Store应用程序无法使用此功能。

答案 2 :(得分:-1)

原来,WP8.1有一个WinMMBase.dll而不是普通的旧winmm.dll。

我通过运行Web服务器黑客来浏览System32文件夹(参见xda-developers)。下载dll并使用DLL Export(http://www.nirsoft.net/utils/dll_export_viewer.html)检查后,我发现它确实有waveSetOutVolume函数。虽然函数本身似乎不会影响音量,但这不是我猜的问题的重点:)