質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

4060閲覧

【C++】WAVファイルの読み込みプログラム 外部シンボルエラー

YMD_kts

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/06/06 03:25

編集2019/06/06 03:27

こちらのサイトを参考に、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-messagebox

User32.libもリンクしてみてください。


追記:

試していませんが、
#include"wavefile.cpp"

#include "wavefile.h"
ではないでしょうか?

投稿2019/06/06 04:09

編集2019/06/13 02:14
takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YMD_kts

2019/06/13 01:50

解凍ありがとうございます。 体調不良でしばらく寝込んでおり返信が遅れてしまいました。 本題ですが、User32.libもリンクしてみたのですが、やはり同じエラーが出てしまいました。
takabosoft

2019/06/13 02:15

追記しました。お身体は大丈夫ですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問