您的位置:首页 > 其它

在自己构造的DLL动态链接库中调用winmm.lib的mciSendString函数有问题

2014-06-11 18:32 405 查看
这是在我编写利用MCI中mciSendString函数打开光驱遇到的问题。

具体命令是

// FirstDLL.cpp : 定义 DLL 应用程序的入口点。
//

#include "stdafx.h"
#include<mmsystem.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"winmm.lib")

extern "C" __declspec(dllexport) VOID MsgBox(char *szMsg);
void SetCdaudio(BOOL bOpen);
VOID MsgBox(char *szMsg)
{
char szModuleName[MAX_PATH] = {0};
GetModuleFileName(NULL,szModuleName,MAX_PATH);
MessageBox(NULL,szMsg,szModuleName,MB_OK);
}
#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD  ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
MsgBox("DLL_PROCESS_ATTACH");
//MessageBox(NULL,"dddddddddd!!! ","提示!!!",MB_ICONINFORMATION|MB_YESNO);
SetCdaudio(true);
Sleep(5000);
SetCdaudio(false);
//mciSendStringA("set cdaudio door open",NULL,0,NULL);
//
// MessageBox(NULL,"cccccccccc!!! ","提示!!!",MB_ICONINFORMATION|MB_YESNO);
break;
}
case DLL_PROCESS_DETACH:
{
MsgBox("DLL_PROCESS_DETACH");
break;
}
case DLL_THREAD_ATTACH:
{
break;
}
case DLL_THREAD_DETACH:
{
break;
}
}
return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

void SetCdaudio(BOOL bOpen)
{
if(bOpen)
{

//打开光驱
//MessageBox(NULL,"dddddddddd!!! ","提示!!!",MB_ICONINFORMATION|MB_YESNO);
mciSendStringA("set cdaudio door open",NULL,0,NULL);
//MessageBox(NULL,"cccccccccc!!! ","提示!!!",MB_ICONINFORMATION|MB_YESNO);
}
else
{
//关闭光驱
mciSendStringA("set cdaudio door closed",NULL,NULL,NULL);
}
}
这是测试代码:

#include <windows.h>

typedef  VOID (*PFUNMSG)(char*);

extern "C" VOID MsgBox(char *szMsg);
#pragma comment(lib,"FirstDLL")

int main()
{
HMODULE hModule = LoadLibrary("FirstDLL.dll");
if(hModule == NULL)
{
MessageBox(NULL,"FirstDLL.dll文件不存在","DLL加载失败",MB_OK);
return -1;
}

PFUNMSG pFunMsg = (PFUNMSG)GetProcAddress(hModule,"MsgBox");
pFunMsg("Hello First Dll");

return 0;
}
当mciSendString在非DLL文件中时可以正常工作,但是到了这个DLL中就会无限执行下去,停止在mciSendString处。

但是用更深一层的:

MCI_OPEN_PARMS parm ;//打开参数
parm.lpstrDeviceType="CDAUDIO" ; //设备类型为光驱  指定设备类型为CD_ROM
mciSendCommand(NULL,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE,(DWORD)&parm ) ; //初始化光驱   并且是参数中的 光驱类型有效
mciSendCommand(MCI_ALL_DEVICE_ID,MCI_SET,MCI_SET_DOOR_OPEN,NULL)  ;//打开光驱    对光驱进行操作


来设置就可以实现。

最后的代码来自:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: