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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

C++

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

Q&A

解決済

1回答

1791閲覧

WinAPI マルチスレッドにおける子ウィンドウの作成 ver.2

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

C++

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

0グッド

0クリップ

投稿2018/11/24 07:04

前提・実現したいこと

以前質問したteratail:WinAPI マルチスレッドにおける子ウィンドウの作成の未解決シンボルエラーの原因は定義されたファイルの未インクルードであったと思ったのですが少し改修しましたが複数定義のエラーが消えません.どのように記述すればいいのでしょうか?

また以前聞かれましたマルチスレッドにおける子ウィンドウ作成の目的はメインウィンドウの処理軽減です.常時ではなく必要なときのみ子ウィンドウを作成しそこに自作のプログレスバーを表示させ処理が済めばプログレスバーを子ウィンドウのスレッド諸共削除しようと考えたためです.常時何も描かない子ウィンドウを用意してもこの程度なら処理が特別重くなるものではないとは思いますが学習目的です.

発生している問題・エラーメッセージ

LINK2005 cWindowProcは既にdefthread.objで定義 LINK2005 cwthreadは既にdefthread.objで定義 LINK1169 1つ以上の複数定義シンボルが存在

###コード概要(前回同様)
スレッドへ渡すデータはPassHandleで親のHWNDとHINSTANCE
親ウィンドウプロシージャWM_CREATEで子ウィンドウ作成のスレッド作成
そのスレッドでWNDCLASSEX登録,ウィンドウ作成,子ウィンドウのプロシージャ作成

該当のソースコード

C

1//main.cpp 2#define UNICODE 3 4#include <windows.h> 5#include <process.h> 6#include "defstructure.cpp" 7#include "defthread.cpp" 8 9LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 10 11const wchar_t CLASS_NAME[] = L"CLASS"; 12 13HINSTANCE hInst; 14 15int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR nCmdLine, int nCmdShow) { 16 UNREFERENCED_PARAMETER(hPrevInstance); 17 UNREFERENCED_PARAMETER(nCmdLine); 18 19 hInst = hInstance; 20 21 WNDCLASSEX wc = { 22 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, WindowProc, 23 0, 0, hInstance, 24 NULL, NULL,(HBRUSH)GetStockObject(WHITE_BRUSH), 25 NULL, CLASS_NAME, NULL 26 }; 27 28 RegisterClassEx(&wc); 29 30 HWND hwnd = CreateWindowEx( 31 0, CLASS_NAME, L"Template", WS_OVERLAPPEDWINDOW, 32 50, 50, 960, 525, 33 NULL, NULL, hInstance, NULL 34 ); 35 36 ShowWindow(hwnd, nCmdShow); 37 UpdateWindow(hwnd); 38 39 MSG msg = {}; 40 41 while (GetMessage(&msg, NULL, 0, 0)) { 42 TranslateMessage(&msg); 43 DispatchMessage(&msg); 44 } 45 46 return (int)msg.wParam; 47} 48 49LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 50 switch (uMsg) { 51 case WM_CREATE: 52 53 static PassHandle *mph; 54 mph->hwnd = hwnd; 55 mph->hInst = hInst; 56 57 _beginthreadex(NULL, 0, (_beginthreadex_proc_type)cwthread, mph, 0, NULL); 58 break; 59 60 case WM_PAINT: 61 { 62 PAINTSTRUCT ps = {}; 63 HDC hdc = GetDC(hwnd); 64 65 BeginPaint(hwnd, &ps); 66 FillRect(hdc, &ps.rcPaint, (HBRUSH)GetStockObject(BLACK_BRUSH)); 67 EndPaint(hwnd, &ps); 68 } 69 break; 70 71 case WM_DESTROY: 72 PostQuitMessage(0); 73 return 0; 74 } 75 76 return DefWindowProc(hwnd, uMsg, wParam, lParam); 77}

C

1//defstructure.cpp 2#pragma once 3 4#include <windows.h> 5 6struct PassHandle { 7 HWND hwnd; 8 HINSTANCE hInst; 9}; 10 11const wchar_t CHILD_CLASS_NAME[] = L"Child Class Name";

C

1//defthread.cpp 2#pragma once 3 4#ifndef UNICODE 5#define UNICODE 6#endif 7 8#include <windows.h> 9#include "defstructure.cpp" 10 11LRESULT CALLBACK cWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 12 switch (uMsg) { 13 case WM_CREATE: 14 break; 15 16 case WM_PAINT: 17 { 18 PAINTSTRUCT ps = {}; 19 HDC hdc = GetDC(hwnd); 20 21 BeginPaint(hwnd, &ps); 22 FillRect(hdc, &ps.rcPaint, (HBRUSH)GetStockObject(GRAY_BRUSH)); 23 EndPaint(hwnd, &ps); 24 } 25 break; 26 27 case WM_DESTROY: 28 PostQuitMessage(0); 29 return 0; 30 } 31 32 return DefWindowProc(hwnd, uMsg, wParam, lParam); 33} 34 35DWORD WINAPI cwthread(LPVOID *lpvoid) { 36 PassHandle *pd; 37 pd = (PassHandle*)lpvoid; 38 HWND hwnd = pd->hwnd; 39 HINSTANCE hInst = pd->hInst; 40 41 WNDCLASSEX wc = { 42 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, cWindowProc, 43 0, 0, hInst, 44 NULL, NULL,(HBRUSH)GetStockObject(WHITE_BRUSH), 45 NULL, CHILD_CLASS_NAME, NULL 46 }; 47 48 RegisterClassEx(&wc); 49 50 HWND chwnd = CreateWindowEx( 51 0, CHILD_CLASS_NAME, L"Child", WS_CHILD | WS_OVERLAPPEDWINDOW, 52 5, 5, 960, 540, 53 hwnd, 0, hInst, 0 54 ); 55 56 ShowWindow(chwnd, SW_SHOW); 57 UpdateWindow(chwnd); 58 59 return 0; 60}

補足情報

Windows10
VisualStudio2017 Community

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

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

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

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

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

guest

回答1

0

ベストアンサー

ヘッダとソースの違いを意識してください。

ソースからソースをincludeした結果
同一識別子の多重定義が発生しています。

手っ取り早く解決するのならmain.cpp以外の拡張子を.hppあたりに変更する事です。


原因を取り除きたい場合は、宣言と定義を分けて
定義を含んだソース(.cpp)のincludeをやめる事です。

投稿2018/11/24 07:12

編集2018/11/24 07:13
asm

総合スコア15147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問