2016-09-05 19 views
0

私はいくつかのユーティリティ機能を備えた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 
+1

* Windowsフォーム* - WindowsフォームはC++言語の一部ではありません。あなたが投稿したコードはC++でさえありません。 – PaulMcKenzie

+0

。 。 。それはVisual Studio 2015が新しいプロジェクトを作成して「C++ Windows Forms」を選択したときに生成されるコードです – Barros

+0

あなたが使用しているツールをよく知っているはずです。生成されたのは 'C++ 'ではなく、' Managed C++ 'や' C++/CLI'と呼ばれるもので、C++やMicrosoftのシンタックスのハイブリッドであり、C++にはまったくありません。次のようなもの: 'void Main(配列^args)'はC++では存在しません。 C + +/CLIで言語を混在させているという問題があり、C++/CLIがC++クラスでうまく動かないというのであれば、私は少し驚いていません。 – PaulMcKenzie

答えて

1

これは(2007年頃以降)既知の問題です。ネイティブC++静的オブジェクトを持つwinformsプロジェクトを持つことに関連しています。 Winformプロジェクトはデフォルトでcrtの初期化をスキップしているようですが、明らかに静的オブジェクトに影響を与えます。

This link from a Microsoft support personThis link from another stackoverflow questionで詳しく読むことができます。

基本的にはあなたのWinformsのプロジェクトは

[STAThread] 
void Main(array<String^>^ args) 
{ 
    Application::EnableVisualStyles(); 
    Application::SetCompatibleTextRenderingDefault(false); 

    MyWindowsFormTest::MyForm form; 
    Application::Run(%form); 
} 

まずステップのようなものがメイン宣言を変更しているに見えますMain機能があります。

int main(..) 

続いて行くプロジェクト - >プロパティ - >リンカー - を> Advanced-> Entry Pointを選択します。これを「Main」から「mainCRTStartupStrArray @@ $$ FYMHP $ 01EAPE $ AAVString @ System @@@ Z」に変更します。これはVSバージョンによって異なる場合があります。

しかし、プロジェクト開発に深く関わっていない限り、WinFormsは使用しないでください。私が理解しているように、サポートは中止されています...。

関連する問題