[WinAPI] GetProccAddress powoduje wyjatek

0

Wrzucę może ktoś będzie wiedział o co kaman tej windzie:

Trochę kodu:

typedef void(WINAPI* TGenerateWndBitmap32)(UINT32*,int);
TGenerateWndBitmap32 GenerateWndBitmap32;

linijka powodująca wyjątek:

GenerateWndBitmap32=(TGenerateWndBitmap32)GetProcAddress(hBottomBarAlgorithm,"GenerateWndBitmap32");

i zawartość DLL'ki:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

BOOL APIENTRY DllMain(HINSTANCE,DWORD,LPVOID) { return TRUE; }

//default algorithm genarating bitmap32 bottom Bar's
extern "C" void __declspec(dllexport) WINAPI GenerateBottomBarBitmap32(UINT32* DataBitmap,int BarX)
//UINT32* DataBitmap - pointer to bitmap bits, sizeof this table is always BarX*30 - UINT32 DataBitmap[BarX*30];
//int BarX - width bitmap(bottom Bar) in pixels(width single line in bitmap)
{
  UINT32 ColorValue=0x80a0a0a0;//ARGB alpha=128 red=160 green=160 blue=160
  int NumLine=0;//number of present writing line in bitmap
  int progress_line=0;//write progress of single line
  for(int i=0;i<BarX*30;i++)//write every pixel
  {
    DataBitmap[i]=ColorValue;//write pixel actualy ColorValue
    progress_line++;//step progress of actual line
    if(progress_line==BarX)//if started new line
    {
      NumLine++;//up single line
      progress_line=0;//progress writing line to begin
      if(NumLine<18) ColorValue-=0x080808;//if Line is smaller then 18 change color channels valule to lower
    }
  }
}


extern "C" void __declspec(dllexport) WINAPI GenerateWndBitmap32(UINT32* DataBitmap,int BitmapWidth)
{
  for(int i=0;i<BitmapWidth*24;i++)
  {
    DataBitmap[i]=0xffffffff;
  }
  
}

Wyjątek:
user image

Dodam, że przy imporcie pierwszej funkcji wszystko perfekt, a przy drugiej winda się buntuje, nie kompliuję z żadnymi opcjami optymalizującymi(Dev C++), cóż najwyzej spróbujemy zrobić drugom bibliotekę, ale trochę głupio robić dla każdej funkcji oddzielną DLL :D</image>

0

Mało kodu (to co dałeś jest ok). Wrzuć więcej na pastebin'a

0
adf88 napisał(a)

Mało kodu (to co dałeś jest ok). Wrzuć więcej na pastebin'a

Trochę tego kodu jest, już parę plików *.cpp, niech będzie ten który powoduje błędy:

pastebin

Ale to linijka GetProcAddress powoduje wyjątek, bo jak ją wyrzucić to jest ok.
Sam kod też raczej jest poprawny, w każdym razie kompiluje się..

Z tego co się orientuję, to wyjątek polega na niepoprawnym kodzie samego exe'ca, wykonanie niedozwolonych instrukcji itp. asm nie używam, dlatego wygląda na to, że sam kompilator układa niedozwolony kod

EDIT: CO ciekawe, jeżeli w DLL'ce nie będzie tej funkcji GetProcAddress zwróci poprawnie NULL i wszystko będzie git, a wyjątek występuje w przypadku powodzenia załadowania GenerateWndBitmap32

0

Nie pokazałeś miejsc istotnych mianowićie miejsce, gdzie masz hBottomBarAlgorithm = LoadLibrary(...);
oraz poprawnie działający GetProcAddress(..., "GenerateBottomBarBitmap32");

A większe ilości kodu możesz spokojnie na pastebin'a wrzucać.

0

czyli ten plik(BottomBar.cpp, tamten był Wnds.cpp):
pastebin

A Wnd.cpp widzi HINSTANCE hBottomBarAlgorithm; z extern w tym pliku:

//BottomBar.h
//Variables
extern HINSTANCE hBottomBarAlgorithm;

//Functions
void CreateBottomBar();//Create BottomBar
void DestroyBottomBar();//Destroying BottomBar
void RepaintBottomBar();//Repaint BottomBar

Próbowałem jeszcze GetModuleHandle("DefaultBottomBar.dll") przy ładowaniu tej drugiej funkcji, żeby nie brać z extern, ale z tym samym skutkiem

EDIT: wszystkich kodów mi się nie chce kopiować, jak chcesz to ci wrzucę cały projekt na serwa...

0

Nie potrzebnie wrzucasz tyle kodu, zrób z tym porządek. A cały projekcik jak najbardziej wskazany. Albo na serv'a albo na pastebina o którym trąbie już w 3 postach:

pastebin

//EDIT
Kod 0xc0000094 to dzielenie przez zero, pewnie uchwyt do biblioteki jest zły.
Albo coś się wingrozie po** skoro pisze, że to "unknown software exception"

0

http://lublin.webd.pl/crayze/iceshell.rar - w Dev C++

Wartość uchwytu tuz przed wywołaniem GetProcAddress:

  char buf[64];
  itoa((int)hBottomBarAlgorithm,buf,10);
  InsertString(buf);

A np. wykazało mi: 1873281024
więc wygląda całkiem zwyczajnie...

Trochę piszę już w WinAPI, ale z takim dziwnym błędem do czynienia nie miałem, z poziomu kodu C++, wszystko wygląda zwyczajnie, to musi być od coś strony windy...

Co prawda czasem robiły mi się tego typu wyjątki, ale to dlatego, że ciało klasy miałem w pliku *.h i po zminianie, jego zawartości(tej klasy) trzeba było przekompilować te pliki gdzie była dołączona klasa, bo w róznych plikach klasa by miała różne wartości, co powodowało też wyjątki, ale to logiczne, i przekompilowanie plików pomagało, tutaj nie widzę powodu błędu :(

0

a odpal IceShell.exe może tylko u mnie winda szaleje xd

Na to by wychodziło, że jakoś DLL zawiera złe informacje, bo GetProcAddress dostaje jakieś złe parametry(wewnętrzne), bo to co podaje do funkcji jest raczej dobrze, według msdn. GetProcAddress musi coś błędnie odczytywać ta funkcję, innego wyjścia nie ma

EDIT: no nic szkoda czasu, robie drugą DLL

0

Wrzuciłem do Visuala. Od razu wskazał błąd - typ wywołania jest inny w dll a inny w exe:

extern "C" void __declspec(dllexport) GenerateWndBitmap32(UINT32* DataBitmap,int BitmapWidth)

A na początku topicu podałeś WINAPI !!! a w projekcie go nie ma !

Wyrzuć w cholerę tego ułomnego dev'a i coś lepszego ściągnij. Że ci się chcę tak mordować :|. Polecam Visuala Express.

0

Tzn. z tym też kombinowałem, raz dodawałem raz nie, nawet dla pewności CALLBACK i WINAPI oddzielnie próbowałem ale to przecież to samo :D, zawsze z tym samym skutkiem, w pierwszej funkcji obojętnie czy dam CALLBACK czy nie dam, i tak poprawnie załaduje, to nie ma znaczenia, bo pierwsza i tak się ładuje
//EDIT: nawet próbowałem pisać CALLBACK przed po __declspec(dllexport), i tak pierwsza się ładuje jak by tego nie napisać

0

Aaaaa, ja ci normalnie kuku zrobię ;)
Bład jest w tej linijce: (Wnds.cpp, linia 156)

  int WndSpace=WndsSpace/WndsCount;//once Wnds bellow width

WndsCount jest równe 0 i masz dzielenie przez 0

GDB jest koszmarny, pewnie on ci tak świetnie podpowiedział. Ściągnij sobie Visuala.

0

:D :D :D gdzie ja miałem mózg :D :D teraz wszystko jasne, jeśli funkcji nie załadowało, to funkcja ta nie była wykonywana, i błędu nie było :D

Wielkie dzięki a już prawie miałem drugą DLLkę :D

btw. Wnds nie powinno już na starcie wynosić 0, w każdym razie wielkie dzięki

śmiać mi się chce bo nawet jakbym dał to d drugiej DLLki to i tak było by to samo :D

adf88 napisał(a)

GDB jest koszmarny, pewnie on ci tak świetnie podpowiedział. Ściągnij sobie Visuala.

O tym to ja wiem, nie raz byłem świadkiem widocznego błędu, a debbuger ani słowa, ale tak jakoś się już tyle czasu siedzi</quote>

1 użytkowników online, w tym zalogowanych: 0, gości: 1