在自己构造的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) ;//打开光驱 对光驱进行操作
来设置就可以实现。
最后的代码来自:点击打开链接
相关文章推荐
- java 解决调用c语言实现简单HelloWorld函数生成.dll动态链接库的32位dll文件无法在64位机上运行
- Visual Studio下建立并隐式调用自己的动态链接库dll
- C#调用C++动态链接库之Win32dll(函数)、MFCdll(对话框)
- 【探索wireshark】 动态调用libwireshark.dll中的函数
- Visual Studio下建立并隐式调用自己的动态链接库dll
- 动态链接库DLL导出函数的声明和调用
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- Visual Studio下建立并隐式调用自己的动态链接库dll
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
- 动态链接时要生成DLL和lib时,要导出函数
- VC中无LIB时的DLL隐式链接,制作与VC++相符合的LIB函数符号输入库
- Lib静态链接库和Dll动态链接库
- 动态链接库dll,静态链接库lib, 导入库lib
- vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?
- windows下的动态链接问题(.dll文件的编写与调用)
- 更方便地动态调用DLL导出函数
- C#创建和调用DLL动态链接库
- 在PB中调用其它语言开发的DLL动态链接库
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?