2

私は、c++ win32console と c++ dll から抜け出すソリューションを書くのに苦労しています。私は最終的にリンカエラーなしでそれらを話すことができました(したがって、両方が完全に管理されたC ++ / CLIプロジェクトであると想定しています)が、コンソールを実行すると次のエラーが発生します。

Company.Pins.Bank.Win32Console.exe の 0x03f71849 で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 0x00000001。

コンソールには以下も表示されます

未処理の例外: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。c:...\win32console.cpp:line 20 の wmain で _wmainCRTStartup()

しかし、これは未処理の例外が原因であると想定しています。

このエラーを追跡するだけでなく、以下のコード ブロックで return を実行するとエラーが発生します。(return でリンクされたメソッドは問題なくステップ スルーしているように見えますが、return がうまくいかないようです。)念のために言っておきますが、以下のコードは自分で書いたのではなく、Visual Studio によって生成されたものです。

#ifdef WPRFLAG
int wmainCRTStartup(
#else  /* WPRFLAG */
int mainCRTStartup(
#endif  /* WPRFLAG */

#endif  /* _WINMAIN_ */
        void
        )
{
        /*
         * The /GS security cookie must be initialized before any exception
         * handling targetting the current image is registered.  No function
         * using exception handling can be called in the current image until
         * after __security_init_cookie has been called.
         */
        __security_init_cookie();

        return __tmainCRTStartup();
}

#include "stdafx.h"
#include "UInstruction.h"

#define DllExport  __declspec(dllexport)
#define DllImport  __declspec(dllimport)

using namespace System;

編集: win32console.cpp コードは以下のとおりです。

//int main(array<System::String ^> ^args)
int _tmain(int argc, _TCHAR* argv[])
{
    auto P2 = (TCHAR *)"3 Barrowstead";
    TCHAR* P3 = (TCHAR *)"3 Barrowstead";
    double* P1;
    P1[0] = 13;

    UserInstruction(P1, P2, P3);
}
4

5 に答える 5

8

ポインタを宣言し、それを初期化しないので、オブジェクトを指さない(オブジェクトにはガベージアドレスが含まれている):

double* P1;     

次に、この初期化されていないポインタが指す場所に書き込もうとします。

P1[0] = 13;

初期化されていない変数は使用できません。P1逆参照する前に、あるオブジェクトを指すように初期化する必要があります。

于 2011-05-04T15:52:55.610 に答える
2
double* P1;

初期化されていません。次に、最初のエントリを 13 に設定しようとします。ブーム、アクセス違反、またはさらに悪いことです。

これらのスニペットのいずれかが機能するはずです。

double P1;
P1 = 13;
UserInstruction(&P1, P2, P3);

また

double P1[1];
P1[0] = 13;
UserInstruction(P1, P2, P3);

また

double *P1 = new double[1];
P1[0] = 13;
UserInstruction(P1, P2, P3);
delete[] P1;
于 2011-05-04T15:54:57.627 に答える
1

UNICODEビルドを使用する場合、次のステートメントも間違っています。

  auto P2 = (TCHAR *)"3 Barrowstead";
  TCHAR* P3 = (TCHAR *)"3 Barrowstead"; 

通常の(char)配列をwchar_tポインターにキャストしているためです。

UNICODEでビルドする場合は、次のように変更する必要があります。

  LPCTSTR P2 = _T("3 Barrowstead");
  LPCTSTR P3 = _T("Barrowstead"); 
于 2011-05-04T18:15:21.753 に答える
0

次の方法でエラーを見つけることができました。

  • エラーがポップアップした行にはありませんでした。
  • それは実際、私がPIN_PTR記憶している最後の場所にありました。

以下を使用してベクターをコピーしました。

memcpy(&pined_ptr[0],&unmanagedvector[0],sizeofunmanagedvector);

問題は PINED_PRT SIZE < unmanagedVectorSize!愚かなエラー。

これにより、管理されているすべてのメモリが台無しになり、後でいくつかの行と機能が公開されました。

コードで見つける方法: コードがクラッシュしなくなるまで、コードの範囲を無効にします。

于 2012-10-28T18:13:47.533 に答える
0

TCHAR*UNICODE が定義されているかTCHAR*のように、文字列リテラルを に変換することは未定義の動作wchar_t*であり、文字列リテラルは ではなく、wchar_t*このポインター変換は未定義です。

于 2011-05-04T15:57:05.113 に答える