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

这是在我编写利用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)  ;//打开光驱    对光驱进行操作

来设置就可以实现。

最后的代码来自:点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值