こちらのサイトを参考に、VisualC++を用いてWAVファイルのデータを読み込むプログラムを書いていたところ、外部シンボルを含む次のエラーが発生してしまいました。
エラー LNK1120 1 件の未解決の外部参照 WavRead C:\Users***\source\repos\WavRead\x64\Debug\WavRead.exe 1 エラー LNK2001 外部シンボル "__imp_MessageBoxA" は未解決です。 WavRead C:\Users***\source\repos\WavRead\WavRead\Main.obj 1 エラー MSB6006 "link.exe" はコード 1120 を伴って終了しました。 WavRead C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets 719
こちらがソースコードになります。元サイト様と違い、関数定義の別ファイルを作成しています。
開発環境:Visual Studio 2019, VisualC++
Main.cpp
#include"wavefile.cpp" // エラー表示 void ErrMsg(PCTSTR text, PCTSTR caption) { MessageBox(NULL, text, caption, MB_OK); } // マルチメディア関数のエラーを表示 MMRESULT MMErrMsg(MMRESULT result, PCTSTR caption) { #ifdef _DEBUG if (result != MMSYSERR_NOERROR) { TCHAR text[256]; mciGetErrorString(result, text, sizeof(text) / sizeof(text[0])); MessageBox(NULL, text, caption, MB_OK); } #endif return result; } int main(void) { WAVEFORMATEX wfe; WAVEHDR whdr; HWAVEOUT hwout; LoadWaveFile("sinwave.wav",&wfe,&whdr); //CloseWaveFile(hwout,&whdr); return 0; }
wavefile.h
wavefile.h
1#ifndef wavefile_H 2#define wavefile_H 3 4#include <stdio.h> 5#include <stdlib.h> 6#include <mmeapi.h> 7#include <minwindef.h> 8#include <MMsystem.h> 9#include <Windows.h> 10 11bool LoadWaveFile(PCTSTR lpFileName, WAVEFORMATEX *lpwfe, WAVEHDR *lpwhdr); 12#endif
wavefile.cpp
wavefile.cpp
1#include <Windows.h> 2#include "Include/wavefile.h" 3 4#pragma comment(lib, "WinMM.Lib") 5 6 7bool LoadWaveFile(PCTSTR lpFileName, WAVEFORMATEX* lpwfe, WAVEHDR* lpwhdr) 8{ 9 HANDLE fh = CreateFile(lpFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 10 11 if (fh == INVALID_HANDLE_VALUE) { 12 MessageBox(NULL, "ファイルを開けません", lpFileName, MB_OK); 13 return false; 14 } 15 16 //開いたファイルをメモリ領域にコピーする 17 DWORD dwFileSize = GetFileSize(fh, NULL); 18 BYTE* lpBuf = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwFileSize); //HeapAllocで上で取得したファイルサイズ分のメモリを確保 19 DWORD dwReadSize; 20 ReadFile(fh, lpBuf, dwFileSize, &dwReadSize, NULL); 21 CloseHandle(fh); 22 23 char str[4]; 24 strncpy_s(str, (char*)(lpBuf + 8), 4); 25 if (strncmp(str, "WAVE", 4)) 26 { 27 HeapFree(GetProcessHeap(), 0, lpBuf); 28 MessageBox(NULL, "WAVEファイルを指定してください", lpFileName, MB_OK); 29 return false; 30 } 31 32 //フォーマット情報をコピー 33 CopyMemory(lpwfe, lpBuf + 20, 16); 34 35 //PCM形式のWaveファイルでない場合にfalseを返す 36 if (lpwfe->wFormatTag != WAVE_FORMAT_PCM) { 37 HeapFree(GetProcessHeap(), 0, lpBuf); 38 MessageBox(NULL, "PCM形式のWAVEファイルを指定してください", lpFileName, MB_OK); 39 return false; 40 } 41 42 strncpy_s(str, (char*)(lpBuf + 36), 4); 43 int offset; 44 if (!strncmp(str, "fact", 4)) offset = 56; 45 else if (!strncmp(str, "data", 4)) offset = 44; 46 else { 47 HeapFree(GetProcessHeap(), 0, lpBuf); 48 MessageBox(NULL, "正体不明のファイルです", lpFileName, MB_OK); 49 return false; 50 } 51 DWORD size = *(DWORD*)(lpBuf + offset - 4); 52 BYTE * lpWave = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); 53 CopyMemory(lpWave, lpBuf + offset, size); 54 HeapFree(GetProcessHeap(), 0, lpBuf); 55 56 lpwhdr->lpData = (LPSTR)lpWave; 57 lpwhdr->dwBufferLength = size; 58 lpwhdr->dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; 59 lpwhdr->dwLoops = 1; 60 61 return true; 62}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/13 01:50
2019/06/13 02:15