这是在我编写利用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) ;//打开光驱 对光驱进行操作
来设置就可以实现。
最后的代码来自:点击打开链接