DllImport 调用 dll文件错误,引用了一个外部dll 就是说找不到文件!!winmm.dll 关于多媒体定时器的

hvac_011 2012-08-30 12:44:42
就是一个简单的代码!源代码如下



[DllImport("winmm.dll", EntryPoint = "timeSetEvent")]
public static extern int timeSetEvent(int uDelay, int

uResolution, TimerCallback lp, Object dwUser, int uFlags);


TimerCallback delay = new TimerCallback(this.nullHash);

int id1 = timeSetEvent(5,0,delay,0,0);

public void nullHash(Object state)
{
MessageBox.Show("11111");
}








为什么总是提示我
无法找到 PInvoke DLL“winmm.dll”
我已经确认系统的 win32路径下有这个dll文件 并且在文件执行路径下也有放了一个文件,可是依然提示我找不到啊!!!

我是要用他实现准确定时的,可是现在连测试都通不过!

各位前辈江湖救急啊!!
...全文
416 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
songshihong123 2014-07-04
  • 打赏
  • 举报
回复
解决没有,我也遇到同样的问题,现在都没有解决,如解决,请帮助qq2207393858
hvac_011 2012-09-02
  • 打赏
  • 举报
回复
不要沉下去啊~~自己顶!!
hvac_011 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]
是否wince压根就不支持啊。

参考:http://topic.csdn.net/u/20091118/11/97cef9b8-6fc6-4128-8a8f-7a654956a381.html
[/Quote]

完全凌乱了!难道就不能在CE下有个高精度的定时器吗?
机器人 2012-09-01
  • 打赏
  • 举报
回复
hvac_011 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
引用 12 楼 的回复:

引用 11 楼 的回复:
注册一下这个dll应该可以
regsvr32 DllFullPath,保存为.bat文件,然后run as administration

还有在项目的reference当中看看Embed Interop type是不是true,如果是的话,设置为false试试看


不行啊!这个问题不是在桌面windows下,而是在Winc……
[/Quote]


我已经把dll问价拷贝到,软件运行的wince目录下面了!
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
注册一下这个dll应该可以
regsvr32 DllFullPath,保存为.bat文件,然后run as administration

还有在项目的reference当中看看Embed Interop type是不是true,如果是的话,设置为false试试看
[/Quote]

不行啊!这个问题不是在桌面windows下,而是在Wince下,在window桌面平台是没有问题的!!

就是当把工程建立为智能设备时他就找不到 文件!!!
liuxin0121 2012-08-30
  • 打赏
  • 举报
回复
注册一下这个dll应该可以
regsvr32 DllFullPath,保存为.bat文件,然后run as administration

还有在项目的reference当中看看Embed Interop type是不是true,如果是的话,设置为false试试看
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 5 楼 的回复:

引用 4 楼 的回复:
用完全路径试下,如:[DllImport("C:\WINDOWS\system32\Winmm.dll", CharSet = CharSet.Auto)]


忽视了一个重要环节!!!
我是在wince环境下使用!

刚才我重新建立一个window平台去编译它 就没哟问题!

但是在CE下面就不行!


这个DLLIM……
[/Quote]

还是不行啊!
老龙友 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:
用完全路径试下,如:[DllImport("C:\WINDOWS\system32\Winmm.dll", CharSet = CharSet.Auto)]


忽视了一个重要环节!!!
我是在wince环境下使用!

刚才我重新建立一个window平台去编译它 就没哟问题!

但是在CE下面就不行!
[/Quote]

这个DLLIMPORT 是一个很变态的东西,我以前试过放在c:\windows\system32\目录不行,提示找不到,但是放在c:\windows\system\目录就好了。。。你可以参考一下,多放几个目录试试。。
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
我在EVC下可以
Castiel丶Luo 2012-08-30
  • 打赏
  • 举报
回复
wince?支持么..
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
自己顶!!!!
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
用完全路径试下,如:[DllImport("C:\WINDOWS\system32\Winmm.dll", CharSet = CharSet.Auto)]
[/Quote]

忽视了一个重要环节!!!
我是在wince环境下使用!

刚才我重新建立一个window平台去编译它 就没哟问题!

但是在CE下面就不行!
happytonice 2012-08-30
  • 打赏
  • 举报
回复
用完全路径试下,如:[DllImport("C:\WINDOWS\system32\Winmm.dll", CharSet = CharSet.Auto)]
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
这个问题已经折磨我2天了!我各种方法都尝试了,dll已经拷贝到win32文件夹下面了,但是系统原来就有,我在工程的引用路径中也添加了,相关路径 可是就是不行!

我在论坛中看到了其他的关于多媒体定时器的应用,我也拷贝了一份在我机器上运行,都是在运行中出现同样的问题!



using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace O_S_updata
{
public class MMTimer : IDisposable
{
//Lib API declarations
[DllImport("Winmm.dll", CharSet = CharSet.Auto)]
static extern uint timeSetEvent(uint uDelay, uint uResolution, TimerCallback lpTimeProc, UIntPtr dwUser, uint fuEvent);

[DllImport("Winmm.dll", CharSet = CharSet.Auto)]
static extern uint timeKillEvent(uint uTimerID);

[DllImport("Winmm.dll", CharSet = CharSet.Auto)]
static extern uint timeGetTime();

[DllImport("Winmm.dll", CharSet = CharSet.Auto)]
static extern uint timeBeginPeriod(uint uPeriod);

[DllImport("Winmm.dll", CharSet = CharSet.Auto)]
static extern uint timeEndPeriod(uint uPeriod);

//Timer type definitions
[Flags]
public enum fuEvent : uint
{
TIME_ONESHOT = 0, //Event occurs once, after uDelay milliseconds.
TIME_PERIODIC = 1,
TIME_CALLBACK_FUNCTION = 0x0000, /* callback is function */
//TIME_CALLBACK_EVENT_SET = 0x0010, /* callback is event - use SetEvent */
//TIME_CALLBACK_EVENT_PULSE = 0x0020 /* callback is event - use PulseEvent */
}

//Delegate definition for the API callback
delegate void TimerCallback(uint uTimerID, uint uMsg, UIntPtr dwUser, UIntPtr dw1, UIntPtr dw2);

//IDisposable code
private bool disposed = false;

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
Stop();
}
}
disposed = true;
}

~MMTimer()
{
Dispose(false);
}

/// <summary>
/// The current timer instance ID
/// </summary>
uint id = 0;

/// <summary>
/// The callback used by the the API
/// </summary>
TimerCallback thisCB;

/// <summary>
/// The timer elapsed event
/// </summary>
public event EventHandler Timer;
protected virtual void OnTimer(EventArgs e)
{
if (Timer != null)
Timer(this, e);
}

public MMTimer()
{
//Initialize the API callback
thisCB = CBFunc;
}

/// <summary>
/// Stop the current timer instance (if any)
/// </summary>
public void Stop()
{
lock (this)
{
if (id != 0)
{
timeKillEvent(id);
Console.WriteLine("MMTimer " + id.ToString() + " stopped");
id = 0;
}
}
}

/// <summary>
/// Start a timer instance
/// </summary>
/// <param name="ms">Timer interval in milliseconds</param>
/// <param name="repeat">If true sets a repetitive event, otherwise sets a one-shot</param>
public void Start(uint ms, bool repeat)
{
//Kill any existing timer
Stop();

//Set the timer type flags
fuEvent f = fuEvent.TIME_CALLBACK_FUNCTION | (repeat ? fuEvent.TIME_PERIODIC : fuEvent.TIME_ONESHOT);

lock (this)
{
id = timeSetEvent(ms, 0, thisCB, UIntPtr.Zero, (uint)f);
if (id == 0)
throw new Exception("timeSetEvent error");
Console.WriteLine("MMTimer " + id.ToString() + " started");
}
}

void CBFunc(uint uTimerID, uint uMsg, UIntPtr dwUser, UIntPtr dw1, UIntPtr dw2)
{
//Callback from the MMTimer API that fires the Timer event. Note we are in a different thread here
OnTimer(new EventArgs());
}
}


}



都是调用 timeSetEvent时出错!

bdmh 2012-08-30
  • 打赏
  • 举报
回复
在你电脑上搜搜看有没有,如果没有,就去网上下一个,dllimport时,指明路径
hvac_011 2012-08-30
  • 打赏
  • 举报
回复
自己顶啊~~~
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:
注册一下这个dll应该可以
regsvr32 DllFullPath,保存为.bat文件,然后run as administration

还有在项目的reference当中看看Embed Interop type是不是true,如果是的话,设置为false试试看


不行啊!这个问题不是在桌面windows下,而是在Wince下,在window桌面平台……
[/Quote]
不懂wince,但是弱弱的问一下,wince下这个dll是自带的?如果没有注册直接引用是引用不到的
dianjixue1 2012-08-30
  • 打赏
  • 举报
回复
可能是wince下没有winmm.dll的引用文件。

就是win32下面缺少winmm.dll的导入文件。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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