私はいくつかのユーティリティ機能を備えたlibプロジェクトを持っており、コンソールアプリケーションでうまく動作します。Windowsでのアクセス違反ライブラリでfstreamを使用するフォームプロジェクト
これで、libを含むWindowsフォームアプリケーションが起動しました。「0xxxx(ntdll.dll)に例外がスローされました:0xC0000005:アクセス違反が0xxxxの場所を読み取っています。」
アプリケーションコードは、Visual Studioが新しいプロジェクトに追加したコードです。私のlibヘッダの#includeを除いて、私自身のコードは追加されていません。
私は自分のlibコードを少しずつコメントしました。私が "ofstream MyLog;"という行にコメントすると、例外は消え去る。
私はこのプロジェクトをゼロから2,3回再構築しました。同じ結果です。 (1)新しいWinFormプロジェクトを作成する、(2)既存プロジェクトMyLibTestを追加する、(3)それらを接続するための参照を追加する、(4)メインのcppに#includeを追加する、(5) 。
私はこのWinFormプロジェクトを開始して以来、Visual StudioはMicrosoft Symbol Serverからシンボルをダウンロードするのに多くの時間を費やしました。 (ここではstackoverflowのどこかで、このMSサーバは本当に遅いと言われています)
これは関連しています:私はC++を初めて使っていますが、Visual Studio 2015でいくつかのミニプロジェクトを作成して言語クラス、文字列の操作、ベクトル、リスト、Windowsフォームなど)を使用することができます。今私はそれらのすべてをまとめようとしています。
私のコード
//------ MyLibTest.h --------
#pragma once
#include <stdio.h>
#include <string>
#include <map>
#include <Windows.h>
#include <fstream>
#include <iostream>
#include <sstream>
#include <time.h>
#include <cstdarg>
#include <memory>
//------ MyLibTest.cpp --------
#include "MyLibTEST.h"
using namespace std;
ofstream MyLog; // <<<< if i comment this line, the Access violation exception does not happen
のWinFormアプリケーションコードのVisual Studioで追加された2015
//------ MyForm.h --------
#pragma once
namespace MyWindowsFormTest {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->components = gcnew System::ComponentModel::Container();
this->Size = System::Drawing::Size(300,300);
this->Text = L"MyForm";
this->Padding = System::Windows::Forms::Padding(0);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
}
#pragma endregion
};
}
//------ MyForm.cpp --------
#include "Q:\MyDesv\Visual Studio Projects\Projects\MyLibTest\MyLib\MyLibTest.h"
#include "MyForm.h"
using namespace System;
using namespace System::Windows::Forms;
[STAThread]
void Main(array<String^>^ args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
MyWindowsFormTest::MyForm form;
Application::Run(%form);
}
コールスタック
ntdll.dll!RtlValidateHeap() Unknown
[email protected]() Unknown
> ucrtbased.dll!_CrtIsValidHeapPointer(const void * block) Line 1407 C++
ucrtbased.dll!_msize_dbg(void * block, int block_use) Line 1059 C++
ucrtbased.dll!_msize(void * block) Line 38 C++
ucrtbased.dll!_recalloc_dbg(void * block, unsigned int count, unsigned int element_size, int block_use, const char * file_name, int line_number) Line 784 C++
ucrtbased.dll!_register_onexit_function::__l2::<lambda>() Line 112 C++
ucrtbased.dll!__crt_seh_guarded_call<int>::operator()<void <lambda>(void),int <lambda>(void) &,void <lambda>(void) >(__acrt_lock_and_call::__l2::void <lambda>(void) && setup, _register_onexit_function::__l2::int <lambda>(void) & action, __acrt_lock_and_call::__l2::void <lambda>(void) && cleanup) Line 204 C++
ucrtbased.dll!__acrt_lock_and_call<int <lambda>(void) >(const __acrt_lock_id lock_id, _register_onexit_function::__l2::int <lambda>(void) && action) Line 912 C++
ucrtbased.dll!_register_onexit_function(_onexit_table_t * table, int(*)() function) Line 84 C++
CppWinForm2.exe!_onexit(int(*)() function) Line 268 C++
CppWinForm2.exe!atexit(void(*)() function) Line 276 C++
CppWinForm2.exe!std::`dynamic initializer for '_Fac_tidy_reg''() Line 65 C++
[External Code]
[email protected]() Unknown
[email protected]() Unknown
[email protected]@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
[email protected]() Unknown
* Windowsフォーム* - WindowsフォームはC++言語の一部ではありません。あなたが投稿したコードはC++でさえありません。 – PaulMcKenzie
。 。 。それはVisual Studio 2015が新しいプロジェクトを作成して「C++ Windows Forms」を選択したときに生成されるコードです – Barros
あなたが使用しているツールをよく知っているはずです。生成されたのは 'C++ 'ではなく、' Managed C++ 'や' C++/CLI'と呼ばれるもので、C++やMicrosoftのシンタックスのハイブリッドであり、C++にはまったくありません。次のようなもの: 'void Main(配列^args)'はC++では存在しません。 C + +/CLIで言語を混在させているという問題があり、C++/CLIがC++クラスでうまく動かないというのであれば、私は少し驚いていません。 –
PaulMcKenzie