_fpeti_ 2010.09.14. 03:28

Kezdetnek egy kis win32: Erőforrások és a VS2008EE (C++)

Modelnézgetőt írtam, és szükségem volt egy effekt textfile-jánaknak a programhoz csatolására. Ha ugyanis rákkattintunk egy programhoz rendelt filera, a munkakönyvtár nem az exe könyvtára lesz, hanem a file-é amire klikkeltünk, így az exe könyvtárában tárolt fileokat nem tudja elérni. Lehetne központi helyen tárolni az exe helyét (registry) de abban nem vájkálok, amíg nem muszáj. Mivel az express verziókból kivették a resource-okkal foglalkozó részt, nem működnek az 'adjunk hozzá ilyen meg olyan erőforrásokat a projekthez ilyen meg olyan gombokkal' tutorialok  :).

Kell leíró file .rc kiterjesztéssel, amiben nevekkel és típusokkal ellátott file elérések lesznek.
Nálam így néz ki:
------------------res.rc -----------------------
// resource(s)

#include "resource.h"


ICON_MAIN         ICON    "mloadericon.ico"
MYTXT_FILE    MINDEGY "effect.fx"
------------------------------------------------

Az első a progi ikonja, mely sokaknak ismerős lehet, a program fő ikonját adhatjuk meg vele, ha betöltjük az ablak létrehozásakor.
WNDCLASS::hIcon -jába kell betölteni valami ilyeténképpen:
----------------------------------------------------------------
#include "resource.h"
// ablak init (részlet):
WNDCLASS w;
w.hIcon = LoadIcon(Myinstance,MAKEINTRESOURCE(ICON_MAIN));

----------------------------------------------------------------
A .rc második sora az érdekesebb, a 'MYTXT_FILE' a hivatkozás, a 'MINDEGY' pedig meglepően a típusa. Nem mintha az MS-nél ennyire elszabadult volna a 'Hungarian Notation' irányba, hanem egyszerűen nincs textfile-típus az erőforrások között, én adtam eme elmés nevet neki. A harmadik paraméter a file neve, ami egy text formátumú hlsl effekt file.
Mivel VSee nem hajlandó létrehozni/megnyitni az .rc fileokat, notepad-del lehet ezt elkövetni, majd hozzá kell csatolni a projekthez, mint egy sima .h vagy .cpp filet.

Volt még ott egy '#include "resource.h"' is, amit szintén nekünk kell megírni, ebben vannak a neveknek megfelelő integer értékek #define-ok formájában, így a MAKEINTRESOURCE() makróval lehet hivatkozni a nevekre (amúgy stringként kellene megadni a neveket, bemásolgatva mindenhova, nem annyira elegáns, mit ez.)

resource.h tartalma:
------------------------------------------------
//{{NO_DEPENDENCIES}}

#define ICON_MAIN        1024
#define MYTXT_FILE        1025
------------------------------------------------

A kommentes rész is fontos.
Ezt a filet lehet mindenhová include-olni, ahol használni szeretnénk erőforrásokat. A resource.h is természetesen csatolni kell a projekhez.
A standard win32 alap függvényeket biztosít a különféle cuccok betöltéséhez (a már említett LoadIcon,LoadBitmap stb), de textfile-ra nincsen töltike. Viszont bármilyen erőforrásra rákereshetünk a FindResource() fv vel, aminek kell a id-ja és a típus.
Ha nem null-t ad vissza, akkor a LoadResource()-al lehet 'globális' memóriába tölteni. Majd a LockResource() ad erre egy void* pointert, amit én a saját char típusomra (int8) alakítok. (nem is bonyolították túl, mi?)
--------c(pp) kód-----------------------------------------
HRSRC h = FindResource(NULL,MAKEINTRESOURCE(MYTXT_FILE),"MINDEGY");
if(h!=NULL)
{
    HGLOBAL a = LoadResource(NULL,h);
    if(a != NULL)
    {
        peffecttext = (int8*)LockResource(a);
        if(peffecttext)

       {
          // tölthetjük is az effektet befelé, D3DXCreateEffect()-el.
       }
    }
}    
-------------------------------------------------

Ez a módszer sok más nem támogatott file típusra is alkalmas lehet, csak tudjuk mit kezdeni a kapott memóriakupaccal. (A void*-tól rettegőknek nem ajánlott a módszer.)

UPDATE:

Release verzióban akad ezzel egy kis gond, mégpedig az, hogy a szöveg végén nincs nulla, amitől rácsoroghatunk nemkívánatos memóriarészekre is. (valami 'PAD(' rész van a végén nálam, gondolom paddig.)
Megoladásként használható a 
SizeofResource(NULL,h);
Ezzel le lehet kérdezni resource méretét byte-ban, s ennyit átmásolva stringbe és hozzadva a nullát a végére már oké.

Címkék:win32 resources Szólj hozzá!

A bejegyzés trackback címe:

https://sortagamedev.blog.hu/api/trackback/id/tr972294579

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.