描述:我用MFC写了个程序,我想把里面的部分功能拿出来做成DLL。新建DLL项目的时候选择了win32 dll,编译通过了,但是添加到MFC项目中调用时出现错误。
头文件和对应的DLL和LIB文件都复制到MFC项目目录下了。
dll 里的头文件定义:#pragma once
#ifndef _CAPTURE_SOUND_H_
#define _CAPTURE_SOUND_H_
#include <windows.h>
#include <mmsystem.h>
#include <dsound.h>
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dsound.lib")#define NUM_REC_NOTIFICATIONS 16
#define BUF_SIZE 480class _declspec(dllexport) CAdoFrameHandler {
public:
virtual void AdoFrameData(BYTE* pBuffer, long lBufferSize) = 0 ;
};#ifdef _CLASSINDLL
#define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
#define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif class CLASSINDLL_CLASS_DECL CDSoundIn
{
public:
BOOL m_bRecording ; //recording now ? also used by event recv thread
protected:
LPDIRECTSOUNDCAPTURE8 m_pCapDev ; //capture device ptr
LPDIRECTSOUNDCAPTUREBUFFER m_pCapBuf ; //capture loop buffer ptr
LPDIRECTSOUNDNOTIFY8 m_pNotify ; //capture auto-notify event callback handler ptr
GUID m_guidCapDevId ; //capture device id
WAVEFORMATEX m_wfxInput; //input wave format description struct
DSBPOSITIONNOTIFY m_aPosNotify[NUM_REC_NOTIFICATIONS + 1]; //notify flag array
HANDLE m_hNotifyEvent; //notify event
BOOL m_abInputFmtSupported[20];
DWORD m_dwCapBufSize; //capture loop buffer size
DWORD m_dwNextCapOffset;//offset in loop buffer
DWORD m_dwNotifySize; //notify pos when loop buffer need to emit the event
CAdoFrameHandler* m_frame_handler ; // outer frame data dealer ptr
HANDLE m_hThread;
DWORD m_dwThreadID;
public: // callback func to add enum devices string name
static BOOL CALLBACK enum_dev_proc(LPGUID lpGUID, LPCTSTR lpszDesc,
LPCTSTR lpszDrvName, LPVOID lpContext ) ;
static void * notify_capture_thd(LPVOID data) ;
protected:
HRESULT InitDirectSound(GUID dev_id = GUID_NULL) ;
HRESULT FreeDirectSound() ;
HRESULT InitNotifications() ;
HRESULT CreateCaptureBuffer(WAVEFORMATEX * wfx) ;
HRESULT StartOrStopRecord(BOOL bStartRec) ;
HRESULT RecordCapturedData() ;
void SetWavFormat(WAVEFORMATEX * wfx) ;
void GetWaveFormatFromIndex( WAVEFORMATEX* pcmwf );
public:
CDSoundIn(void);
~CDSoundIn(void);
BOOL EnumDevices(HWND hList) ;
BOOL Open(void) ;
BOOL Close() ;
void GrabAudioFrames(BOOL bGrabAudioFrames, CAdoFrameHandler* frame_handler) ;
};
#ifdef __cplusplus
};
#endif
#endifMFC调用:#pragma once#include "DSoundIn.h"// CTestAudioDllDlg 对话框
class CTestAudioDllDlg : public CDialog
{................省略若干行
CDSoundIn m_DSoundIn;
};报错:
1>TestAudioDll.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CDSoundIn::~CDSoundIn(void)" (__imp_??1CDSoundIn@@QAE@XZ),该符号在函数 "public: virtual __thiscall CTestAudioDllDlg::~CTestAudioDllDlg(void)" (??1CTestAudioDllDlg@@UAE@XZ) 中被引用
1>TestAudioDllDlg.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CDSoundIn::~CDSoundIn(void)" (__imp_??1CDSoundIn@@QAE@XZ)
1>TestAudioDllDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CDSoundIn::CDSoundIn(void)" (__imp_??0CDSoundIn@@QAE@XZ),该符号在函数 "public: __thiscall CTestAudioDllDlg::CTestAudioDllDlg(class CWnd *)" (??0CTestAudioDllDlg@@QAE@PAVCWnd@@@Z) 中被引用
1>E:\test\TestAudioDll\Debug\TestAudioDll.exe : fatal error LNK1120: 2 个无法解析的外部命令
头文件和对应的DLL和LIB文件都复制到MFC项目目录下了。
dll 里的头文件定义:#pragma once
#ifndef _CAPTURE_SOUND_H_
#define _CAPTURE_SOUND_H_
#include <windows.h>
#include <mmsystem.h>
#include <dsound.h>
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dsound.lib")#define NUM_REC_NOTIFICATIONS 16
#define BUF_SIZE 480class _declspec(dllexport) CAdoFrameHandler {
public:
virtual void AdoFrameData(BYTE* pBuffer, long lBufferSize) = 0 ;
};#ifdef _CLASSINDLL
#define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
#define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif class CLASSINDLL_CLASS_DECL CDSoundIn
{
public:
BOOL m_bRecording ; //recording now ? also used by event recv thread
protected:
LPDIRECTSOUNDCAPTURE8 m_pCapDev ; //capture device ptr
LPDIRECTSOUNDCAPTUREBUFFER m_pCapBuf ; //capture loop buffer ptr
LPDIRECTSOUNDNOTIFY8 m_pNotify ; //capture auto-notify event callback handler ptr
GUID m_guidCapDevId ; //capture device id
WAVEFORMATEX m_wfxInput; //input wave format description struct
DSBPOSITIONNOTIFY m_aPosNotify[NUM_REC_NOTIFICATIONS + 1]; //notify flag array
HANDLE m_hNotifyEvent; //notify event
BOOL m_abInputFmtSupported[20];
DWORD m_dwCapBufSize; //capture loop buffer size
DWORD m_dwNextCapOffset;//offset in loop buffer
DWORD m_dwNotifySize; //notify pos when loop buffer need to emit the event
CAdoFrameHandler* m_frame_handler ; // outer frame data dealer ptr
HANDLE m_hThread;
DWORD m_dwThreadID;
public: // callback func to add enum devices string name
static BOOL CALLBACK enum_dev_proc(LPGUID lpGUID, LPCTSTR lpszDesc,
LPCTSTR lpszDrvName, LPVOID lpContext ) ;
static void * notify_capture_thd(LPVOID data) ;
protected:
HRESULT InitDirectSound(GUID dev_id = GUID_NULL) ;
HRESULT FreeDirectSound() ;
HRESULT InitNotifications() ;
HRESULT CreateCaptureBuffer(WAVEFORMATEX * wfx) ;
HRESULT StartOrStopRecord(BOOL bStartRec) ;
HRESULT RecordCapturedData() ;
void SetWavFormat(WAVEFORMATEX * wfx) ;
void GetWaveFormatFromIndex( WAVEFORMATEX* pcmwf );
public:
CDSoundIn(void);
~CDSoundIn(void);
BOOL EnumDevices(HWND hList) ;
BOOL Open(void) ;
BOOL Close() ;
void GrabAudioFrames(BOOL bGrabAudioFrames, CAdoFrameHandler* frame_handler) ;
};
#ifdef __cplusplus
};
#endif
#endifMFC调用:#pragma once#include "DSoundIn.h"// CTestAudioDllDlg 对话框
class CTestAudioDllDlg : public CDialog
{................省略若干行
CDSoundIn m_DSoundIn;
};报错:
1>TestAudioDll.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CDSoundIn::~CDSoundIn(void)" (__imp_??1CDSoundIn@@QAE@XZ),该符号在函数 "public: virtual __thiscall CTestAudioDllDlg::~CTestAudioDllDlg(void)" (??1CTestAudioDllDlg@@UAE@XZ) 中被引用
1>TestAudioDllDlg.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CDSoundIn::~CDSoundIn(void)" (__imp_??1CDSoundIn@@QAE@XZ)
1>TestAudioDllDlg.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CDSoundIn::CDSoundIn(void)" (__imp_??0CDSoundIn@@QAE@XZ),该符号在函数 "public: __thiscall CTestAudioDllDlg::CTestAudioDllDlg(class CWnd *)" (??0CTestAudioDllDlg@@QAE@PAVCWnd@@@Z) 中被引用
1>E:\test\TestAudioDll\Debug\TestAudioDll.exe : fatal error LNK1120: 2 个无法解析的外部命令
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货