posts - 25,  comments - 36,  trackbacks - 0

希望大大们可以说一下为什么sndPlaySound 在DLL 中当窗口没有焦点时候就不能发出声音。

还有我把sndPlaySound 放到exe中去了 但出现一些异常 我把一些音乐所在路径发到我这个窗口 然后响应自己定义消息。
但会出现异常,能否说一下不呢。
谢谢大大们
现在我是绕过了访问DLL 里的资源。就可以了出掉上面的问题了。但不知道里面原理

程序:http://115.com/file/anerg35i#小鱼儿键盘发声工具.zip

工程:http://115.com/file/anergzk4#键盘发声系统.zip

如图 一个小小东西。

但里面涉及了一些很多东西 可以联想。因为我开始把SndPlaySound写在动态库中。

当我的这个程序没有获得焦点的时候就不能响起音乐了。


这点我真的不好解释,可能涉及到windows内核 的一些知识,关于内存的。


然后我里面用string 和Cstring  会导致程序动态库初始化失败,开始不知道这个原因,后来自己猜到了。


后面看到了这篇文章。

跨dll使用template/STL需要注意的问题
2010-12-29 12:59

dll:

extern "C"
{
 __declspec(dllexport) void PrintVector(const vector<int> v)
 {
  copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
 }
}

exe:

typedef void (* FUNC)(const vector<int>);

int main()
{
 HMODULE hModule = LoadLibrary("VectorDll.dll");
 if (hModule)
 {
  FUNC fun = (FUNC)GetProcAddress(hModule, "PrintVector");
  vector<int> v(10, 1);
  fun(v);
 }
 return 0;
}

上面代码存在严重的问题,运行时会崩溃:


在windows核心编程中明确的说了在dll中如果申请了内存空间,就一定要在dll中释放这块内存空间。

在exe和dll都静态链接到C/C++运行时库的时候,exe和dll都有各自的堆(heap)空间,所以各自申请的内存需要各自释放。

上面代码将参数改成 const vector<int> & 就可以正常运行。

但是如果exe中的vector版本和dll中vector的版本不同,问题又会出现,并且这些是未知的问题。

所以在dll函数接口中尽量使用基本数据类型。

关于exe和dll内存分配:

http://www.codeguru.com/forum/showthread.php?t=229394

http://www.gamedev.net/community/forums/topic.asp?topic_id=289896

http://blog.csdn.net/dotphoenix/archive/2009/07/14/4348686.aspx

http://blog.sina.com.cn/s/blog_60d705b10100g4ou.html

http://hi.baidu.com/honey%BC%A6/blog/item/8780d1f918976ed5b58f310f.html

关于dll和template/STL:

http://support.microsoft.com/default.aspx?scid=KB;en-us;q172396

http://support.microsoft.com/default.aspx?scid=KB;en-us;q168958

http://www.hellocpp.net/Articles/Article/714.aspx

posted on 2012-05-26 13:12 小鱼儿 阅读(1176) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(4)

随笔档案(25)

搜索

  •  

最新评论

阅读排行榜

评论排行榜