Avatar billede powerj Nybegynder
18. marts 2007 - 00:30 Der er 2 kommentarer og
1 løsning

Access violation 0x00000000

Jeg har lidt problemer i et program jeg bruger til at åbne en exe fil med.

Jeg ved at fejlen først opstår når jeg kører RunProgram ("c:\\installtool.exe","",1); fra min .cpp fil.
Jeg har fået lidt hjælp til en header fil med følgende:

#include "stdafx.h"
#include "isfxinstalled.h"
#include <stdio.h>
#include <tchar.h>
#include <windows.h>

const TCHAR *g_szNetfx11RegKeyName          = _T("Software\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322");
const TCHAR *g_szNetfx11PlusRegValueName    = _T("Install");


bool IsNetfx11Installed();
bool RegistryGetValue(HKEY, const TCHAR*, const TCHAR*, DWORD, LPBYTE, DWORD);


bool IsNetfx11Installed()
{
    bool bRetValue = false;
    DWORD dwRegValue=0;

    if (RegistryGetValue(HKEY_LOCAL_MACHINE, g_szNetfx11RegKeyName, g_szNetfx11PlusRegValueName, NULL, (LPBYTE)&dwRegValue, sizeof(DWORD)))
    {
        if (1 == dwRegValue)
            bRetValue = true;
    }

    return bRetValue;
}

bool RegistryGetValue(HKEY hk, const TCHAR * pszKey, const TCHAR * pszValue, DWORD dwType, LPBYTE data, DWORD dwSize)
{
    HKEY hkOpened;

    if (RegOpenKeyEx(hk, pszKey, 0, KEY_READ, &hkOpened) != ERROR_SUCCESS)
    {
        return false;
    }

    if (RegQueryValueEx(hkOpened, pszValue, 0, &dwType, (LPBYTE)data, &dwSize) != ERROR_SUCCESS)
    {
        RegCloseKey(hkOpened);
        return false;
    }

    RegCloseKey(hkOpened);

    return true;
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR    lpCmdLine,
                      int      nCmdShow)
{
   
   
    TCHAR szMessage[MAX_PATH];

    bool bNetfx11Installed = IsNetfx11Installed();

    if (bNetfx11Installed)
    {
        MessageBox(NULL, _T("The .NET Framework 1.1 is not installed."), _T("The .NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
        //HINSTANCE ShellExecute(handle, _T("open"), _T("installtool.exe"), NULL, NULL, SW_SHOWNORMAL);
        RunProgram ("c:\\installtool.exe","",1);

    }
    else
    {
        MessageBox(NULL, _T("The .NET Framework 1.1 is not installed."), _T("The .NET Framework 1.1"), MB_OK | MB_ICONINFORMATION);
        //ShellExecute(handle, _T("open"), _T("installtool.exe"), NULL, NULL, SW_SHOWNORMAL);
        //system("installtool.exe");
        //RunProgram ("c:\\dotnetfx.exe","",1);
    }
    return 0;
}

Nogen der kan sige mig hvad der går galt??

Fejlen opstår ud fra linien:
return __ascii_strnicmp(dst, src, count);
i filen
strinncmp.c

fejl meddelelsen jeg får er:
Unhandled exception at 0x7c82f38d in isfxinstalled.exe: 0xC0000005: Access violation reading location 0x00000000.
Avatar billede powerj Nybegynder
18. marts 2007 - 00:43 #1
forket kode, her er min header fil:

//---------------------------------------------------------------------------
#pragma argsused
#pragma hdrstop
#include "windows.h"
#include <stdlib.h>

//---------------------------------------------------------------------------
DWORD RunProgram (char* strFunct, char* strstrParams, bool hide)
{
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
char Args[4096];
char *pEnvCMD = NULL;
char *pDefaultCMD = "CMD.EXE";
ULONG rc;

memset(&StartupInfo, 0, sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);

StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = SW_SHOW;


if (hide)
    {
    StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow = SW_HIDE;
  }

Args[0] = 0;
   
pEnvCMD = getenv("COMSPEC");

if(pEnvCMD){

  strcpy(Args, pEnvCMD);
}
else{
  strcpy(Args, pDefaultCMD);
}

strcat(Args, " /c ");

strcat(Args, strFunct);
strcat(Args, " ");
strcat(Args, strstrParams);

if (!CreateProcess( NULL, NULL, NULL, NULL, FALSE,
  CREATE_NEW_CONSOLE,
  NULL,
  NULL,
  &StartupInfo,
  &ProcessInfo))
{
  return GetLastError();
}

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
if(!GetExitCodeProcess(ProcessInfo.hProcess, &rc))
  rc = 0;

CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);

return rc;

}


Beklager!
Avatar billede driis Nybegynder
18. marts 2007 - 11:01 #2
Du kalder CreateProcess med NULL som både første og anden parameter. Det giver ingen mening, og er årsag til din access violation; idet CreateProcess så forsøger at læse din parameter fra adresse 0 (husk, det er pointers); hvilket ikke kan lade sig gøre, idet din proces ikke ejer memory på adresse 0.

Efter hurtigt at have skimmet din kode vil jeg mene det ser ud som om du skal bruge din Args streng som ét af parametrene.

Præcist hvordan er beskrevet her:
http://msdn2.microsoft.com/en-us/library/ms682425.aspx
Avatar billede powerj Nybegynder
19. marts 2007 - 00:43 #3
Glemte at sætte parameter 2 til Args :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester