실행 프로그램에서 공용 dll을 사용하는 경우 아래와 같은 에러가 발생할 때가 있다.

 

File: f:\dd\vctools\crt_bld\self_64_amd64\crt\src\dbgheap.c

Line: 1424

 

Expression: _pFirstBlock == pHead

 

위 에러가 발생했을 때 내가 만든 코드에 문제가 없고 프로젝트 설정에도 문제가 없다면 십중팔구 공용 dll 버전과 내 프로그램의 버전이 달라서 발생한 것이다.

 

여기서 버전이 다르다는 것은 dll exe 프로그램을 만든 Visual Studio 버전이 다르다는 것으로 dll VS 2012로 빌드하고 이것을 VS 2013으로 만드는 프로그램에서 사용하면 프로그램 실행 중에 공용 dll을 호출할 때 발생할 수 있다.

저작자 표시
신고
by 흥배 2014.11.03 08:00

64비트로 빌드하면 유닛테스트 플랫폼을 x64로 맞추어라고 에러가 나올 수가 있는데 

이런 경우 아래처럼 하면 된다.



저작자 표시
신고
by 흥배 2014.10.15 08:00
C++, vc

본인이 만든 것이 아니고 Marc Gregoire 라는 분이 만든 문서로 VC 2013에 대한 IDE 및 C++ 11 기능에 대해 핵심을 간략하게 잘 설명하고 있다. 

참고로 영어를 잘 몰라도 문서 보는데 별로 지장이 없다 ^^


My BeCPP Presentation “What’s new in Visual C++ 2013″ http://www.nuonsoft.com/blog/tag/visual-c-2013/

저작자 표시
신고
by 흥배 2014.09.19 08:00

출처: http://www.naturalsoftware.jp/blog/4271 http://www.naturalsoftware.jp/blog/4611

번역: 최흥배

 

Visual Studio 2012에서는 아래의 3개의 유닛테스트 프로젝트가 추가되었다.

  • C++/CLI(.NET) 유닛테스트 프로젝트
  • C++/CX(Windows 스토어 ) 유닛테스트 프로젝트
  • C++(Native) 유닛테스트 프로젝트


여기서는 C++ 유닛테스트를 소개한다.

1. 테스트 대상 프로젝트를 만든다. 여기서는「Win32 콘솔 애플리케이션」으로「NativeLibrary」라는 프로젝트 이름으로 한다.

2. 애플리케이션 종류를 '스테틱 라이브러리' 하고 완료 한다.

 

3. 다음으로 같은 솔류션에 '기본 유닛테스트 프로젝트' 만든다.

4. 솔루션에 테스트 대상 라이브러리 NativeLibrary」와 테스트 프로젝트 NativeLibraryTest2개가 만들어졌다.

 

5. 상태에서 한번 빌드 해본다. 테스트 탐색기에 ' 실행 테스트' 추가되었다. 테스트 탐색기가 표시되지 않은 경우는 메뉴의 '테스트 | 윈도우 | 테스트 탐색기' 표시한다.

6. 이번에는 '테스트 탐색기' 왼쪽 위에 있는 버튼을 눌러서 '리빌드' 해본다. 빌드 종료와 같이 테스트가 실행된다.

7. 테스트 이름을 바꾸어본다. 테스트 이름은 한국어를 사용해본다. 빌드하면 테스트 탐색기쪽에 메소드 이름이 바뀐다.

8. 실제 테스트 대상으로 하는 클래스를 만들어본다. NativeLibrary 프로젝트의 '추가' 클래스를 추가한다.

 

9. Calc 이라는 이름을 붙인 클래스를 만든다.

 

10. 더하기 계산 멤버 함수를 만든다. 먼저 구현은 하지 않는다.

 

11. NativeLibraryTest 프로젝트 속성을 열고, C++ 「추가 포함 디렉토리」에 $(SolutionDir」을 추가한다.

12. 계속해서 「공통 속석」의 「새로운 참조 추가」를 누른다.

 

13. 테스트 대상 NativeLibrary 프로젝트가 표시 되므로 체크를 넣어서 OK」를 누른다.

14. 참조에 NativeLibrary」가 추가된 것을 확인한다.

 

15. 이것으로 테스트 준비가 끝났으므로 NativeLibraryTest 프로젝트에 테스트 코드를 쓴다. 테스트 대상을 구현하지 않았으므로 테스트는 실패한다.

16. 테스트 대상을 구현한다. 테스트는 성공.

 

이것으로 네이티브 C++ 에서 단위 테스트는 끝이다. C# 같이 메소드나 클래스의 동적 생성, 리팩토링과 같은 기능은 없으므로 조금 시간이 걸린다.

 

 

 

 

 

 

 

 

Visual Studio 2012 네이티브 C++ 유닛테스트에서 아래와 비슷한 클래스간의 테스트를 만든 경우 Asert::AreEqual 에서 다음과 같은 에러가 나온다.

에러 1 error C2676: 이항연산자 '==' : 'const Person' 、이 연산자 또는 정의된 연산자에 적절한 형으로의 변환을 정의하지 않았다.

이것은 Asert::AreEqual == 연산자를 사용하고 있지 않기 때문으로 Person == 연산자를 구현한다.

그러면 이번에는 다른 에러가 나온다.

에러 1 error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class Person>(const class Person &).

모르므로 에러를 더블클릭 해보면 다음의 파일로 이동한다.

에러를 출력하기 위한 함수 템플릿 ToString」이 필요해서 기본적인 형에 대해서는 특별화 되어 있지만 유저 정의현 클래스 등은 특별화 되어 있지 않으므로 static_assert 호출되어 ToString」가 호출되고 있는 같다.

이런 이유로 ToString」을 구현하면 좋을 같다. ToString」는 이름 공간「namespace Microsoft{ namespace VisualStudio {namespace CppUnitTestFramework {」에 구현되어 있으므로 이것에 맞춘다. (Person std::string std::wstring 변환하였다).

 

이것으로 테스트를 실행할 있고 Assert 실패한 경우네는 에러 내용이 표시되도록 되었다.

 

신고
by 흥배 2014.09.15 08:00
샘플 프로젝트 중 'Sample02_ImageViewer'



#include <Windows.h>

#include <balor/graphics/all.hpp>

#include <balor/gui/all.hpp>


using namespace balor::graphics;

using namespace balor::gui;



int APIENTRY WinMain(HINSTANCE , HINSTANCE , LPSTR , int ) 

{

Frame frame(L"ImageViewer");

Bitmap bitmap;


typedef Menu::ItemInfo Item;

Item fileMenuItems[] = {

Item(L"열기(&O)\tCtrl+O", Key::Modifier::ctrl | Key::o),

Item(),

Item(L"종료(&X)\tAlt+F4", Key::Modifier::alt | Key::f4)

};

Item menuBarItems[] = {

Item(L"파일(&F)", fileMenuItems),

Item(L"도움말(&H)", [&] (Menu::Click& ) { MsgBox::show(L"Image Viewer Ver 1.0", L"버전 정보"); })

};

MenuBar menuBar(menuBarItems);

frame.menuBar(&menuBar);


frame.onShortcutKey() = [&] (Frame::ShortcutKey& e) {

switch (e.shortcut()) {

case Key::Modifier::ctrl | Key::o : {

OpenFileDialog dialog;

dialog.filter(L"그림 파일\n*.bmp;*.gif;*.png;*.jpg;*.jpeg;*.tiff\n\n");

if (dialog.show(frame)) {

bitmap = Bitmap(dialog.filePath());

if (bitmap != nullptr) {

frame.scrollMinSize(bitmap.size()); // 윈도우 사이즈가 그림 사이즈보다 작으면 스크롤 할 수 있도록 한다

frame.invalidate();

}

}

e.handled(true);

} break;

case Key::Modifier::alt | Key::f4 : {

frame.close();

e.handled(true);

} break;

}

};

frame.onPaint() = [&] (Frame::Paint& e) {

e.graphics().clear();

if (bitmap != nullptr) {

Graphics bitmapGraphics(bitmap);

e.graphics().copy(frame.scrollPosition(), bitmapGraphics); // 스크롤을 빼고 이미지를 복사한다.

}

};


frame.runMessageLoop();

return 0;

}




저작자 표시
신고
by 흥배 2014.09.01 08:00

Sample 프로젝트 중 Sample01_ButtonAndEvent


#include <Windows.h>

#include <balor/gui/all.hpp>


using namespace balor::gui;



int APIENTRY WinMain(HINSTANCE , HINSTANCE , LPSTR , int ) 

{

Frame frame(L"ButtonAndEvent");


// 버튼 생성

Button button0(frame, 10, 10, 100, 50, L"button0");

// 버튼 클릭 이벤트 설정

button0.onClick() = [&] (Button::Click& ) {

MsgBox::show(L"button0 clicked");

};

// 버튼 생성하면서 클릭이벤트도 설정

Button button1(frame, 10, 80, 100, 50, L"button1", [&] (Button::Click& ) {

MsgBox::show(L"button1 clicked");

});


frame.runMessageLoop();

return 0;

}







저작자 표시
신고
by 흥배 2014.08.29 08:00

Samples 디렉토리에 있는 Saple00_Hello_world 프로젝트 


#include <Windows.h>

#include <balor/gui/all.hpp>


using namespace balor::gui;



int APIENTRY WinMain(HINSTANCE , HINSTANCE , LPSTR , int ) 

{

// 메인 윈도우를 만들고, 타이틀 이름을 "Hello world"로 설정

Frame frame(L"Hello world");


// Win32의 OnPaint 메시지에서 20,10 좌표에 "Hello world"를 출력

frame.onPaint() = [&] (Frame::Paint& e) {

e.graphics().drawText(L"Hello world", 20, 10);

};


// Win32 메시지 처리

frame.runMessageLoop();


return 0;

}






저작자 표시
신고
by 흥배 2014.08.28 08:00

balor ?

일본의 syanji 라는 분이 만든 C++ Windows GUI 라이브러리.

 사이트 http://d.hatena.ne.jp/syanji/archive

balor은 Java나 .NET과 같이 사용하기 쉽고, MFC와 같이 Win32 API와 연동하기 쉬운 라이브러리를 목표로 한다.

라이센스: 비 상용, 상용 상관없이 사용할 수있다.

코드는 http://d.hatena.ne.jp/syanji/20110815/1313411983


위 코드를 받아서 VS2013에서 빌드를 하면 빌드 실패가 발생하고, 주석이 일본어로 되어 있어서 일부는 번역을 했고 나머지는 파일 인코딩 형식을 utf-8로 바꾸어서 제대로 나오게 했다. 일본어 주석은 앞으로 조금씩 번역해 나갈 예정이며, 번역되지 않은 부분은 네이버나 구글 번역을 사용하기 바란다.

본인이 포팅한 소스는 https://github.com/jacking75/balor-chb



balor의 특징

.NET이나 Java와 비슷한 인터페이스.

Win32 API나 STL과 연동하기 쉽다.

람다식으로 이벤트 기술.

스태틱 링크 라이브러리.

우측값참조 지원에 의해 인스턴스 생성에 동적메모리 할당을 강요하지 않는다.



balor의 기능

GUI 라이브러리

File 패스

레지스트리

COM

DLL

Local

등등



balor 이름공간

balor: balor 구현의 근간이 되는 클래스 군

balor::Convert: 기본 데이터 형과 String 형의 변환

balor::graphics: 그래픽스(GDI) 관련

balor::gui: GUI 관련 클래스 군

  GUI 부품(버튼이나 에디터 컨트롤 이나 스크롤바 등) 클래스가 정의 되어 있다.

  balor::gui::Control

    컨트롤 기본 클래스

    balor에서는 Windows 라는 클래스는 정의 되어 있지 않다.

    Button 클래스나 Edit 클래스, 그리고 이것들의 부모 윈도우가 되느 Frame 클래스도 모두 Control에서 파생하고 있다.

    이들 컨트롤을 조합해서 화면을 만든다

  balor::gui::Frame

    탑 레벨로 다른 컨트롤의 프레임이 되는 윈도우를 나타내는 클래스

    balor::gui::Control에서 파생하고 있다.

balor::io: I/O 관련 클래스 군

balor::locale: 로케일이나 캐릭터셋

balor::system: 시스템이나 환경, OS

balor::test: 유닛테스트나 디버그 관련



코드예 

Control ctrl;

ctrl.clientSize(400, 400); // 윈도우 사이즈 설정


bool visible = ctrl.visible() // 표시 상태를 취득


ctrl.onMouseDown() = [](Control::MouseDown &e) {

                 //

            };





저작자 표시
신고
by 흥배 2014.08.25 08:00

MS Build 컨퍼런스에서 Visual C++의 C++ 11 구현에 대한 이야기가 있었다.

작년에 나왔던 VC++ Nov 2013 CTP 다음 버전이 2~3개월 이내에 나올 예정이고 대부분의 C++11을 구현할 예정이라고 한다.

더해서 C++14 기능 중 일부도 구현될 예정이라고 한다.



좀 더 자세한 내용은 http://channel9.msdn.com/Events/Build/2014/2-661 를 보기 바란다.


저작자 표시
신고
by 흥배 2014.04.07 08:00

64비트 프로그램을 디버깅 모드에서 실행 도중 편집을 한 후 그대로 실행할 수 있게 되었다.

그러나 VS를 기본 설치한 상태에서는 되지 않는다.

옵션에서 설정을 해야 한다.


VS 메뉴에서 [도구] - [옵션]을 선택 후 [디버깅][편집하며 계속하기] 항목을 보면 아래와 같다


네이티브 전용 옵션에서 '네이티브 편집하면 계속하기 사용'을 선택해야 디버깅 중 편집한 후 계속 실행할 수 있다.

다만 이 옵션을 살리면 아래와 같은 메시지가 나온다.


Natvis가 무효화 된다는 말인데 이 말은 컨테이너(STL::Vector 등)의 시각화가 무효화 된다는 의미이다.

그래서 디버깅 중 컨테이너 등의 내용을 보기 까다로워진다.


아직까지는 '편집을 한 후 그대로 실행'은 조심스럽게 사용해야 할 것 같다

저작자 표시
신고
by 흥배 2014.03.31 08:00
| 1 2 3 4 |