@D0ct0r_Murder

System.AccessViolationException: «Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.»?

Написал пробную dll для создания процесса на с++. Вызываю её в консоли шарпа - вот такая ошибка. Вот коды:

#include "stdafx.h"
#include <Windows.h>
#include <conio.h>

extern "C" __declspec(dllexport) int CallNewProccess() {
	STARTUPINFO si;
	PROCESS_INFORMATION pi;

	ZeroMemory(&si, sizeof(si));

	if (!CreateProcess(NULL, const_cast<WCHAR*>(L"cmd"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
		return 0;
	}
	else
		return 1;
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

class WinApiClass
{
    [DllImport("DLL4.dll")]
    public static extern int CallNewProccess();
}

namespace ConsoleApp50
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int flag = WinApiClass.CallNewProccess();
            }

            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
        }
    }
}
  • Вопрос задан
  • 8135 просмотров
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
Неправильно инициализировали
https://msdn.microsoft.com/en-us/library/windows/d...

extern "C" __declspec(dllexport) int* CallNewProccess()
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if(!CreateProcess(NULL, const_cast<WCHAR*>(L"cmd"), NULL, NULL,
             FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return 0;
    }
    return pi.hProcess;
}


И нужно придумать как его

// Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );


class WinApiClass
{
[DllImport("DLL4.dll")]
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool CloseHandle(IntPtr hObject);
public static extern IntPtr CallNewProccess();
}


static void Main(string[] args)
{
            IntPtr hndl = 0;
            try
            {
               hndl  = WinApiClass.CallNewProccess();
            }

            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            if( hndl != 0 )
            {
                 CloseHandle(hndl);
            }
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(true);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
1 - для проверки памяти используйте соответствующие тесты 1 и 2

2 - в общем случае, это говорит о том что у вас нарушения адресаций - какой то из подпроцессов залезает в память, которая ему не позволена

ps меня смущает эта строка
ZeroMemory(&si, sizeof(si));
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C++
Начните с того что оттестируете код на C++ в обычном консольном приложении и убедитесь что он работает.
Конкретно сейчас могу посоветовать правильно заполнить структуру STARTUPINFO
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы