WebHU - Programozási kérdések és válaszok

html beágyazása a memóriából képekkel a lemezen c++ nyelven

Megpróbálok html fájlokat betölteni a memóriából és megmutatni. Viszont a következő problémám van. Könnyedén megjeleníthetek html fájlokat az erőforrásból vagy a helyi könyvtárból, és menet közben módosíthatom a tartalmát. A problémám az, hogy a html fájlokban van néhány kép. A képek helyes megjelenítéséhez természetesen a képeknek és a html fájlnak ugyanabban a könyvtárban kell lennie. Ha html-t töltök be az erőforrásból, a html-vezérlő az erőforrás-könyvtárat keresi (FindResource, LoadResource stb.), hogy megtalálja a képet. Ha beállítok egy helyi fájlt az alkalmazáskönyvtárba és betöltöm, akkor működik, de létrehoz egy dummy fájlt a programkönyvtárban. Eszembe jutott néhány ötletem ennek megvalósítására, és remélem, tudtok néhány megjegyzést adni.

  1. Töltsön be egy dummy html fájlt az erőforrásból, adjon hozzá html-t menet közben, FindResource, LoadResource stb. az mshtml-ből, és adja meg a fájl nevét, méretét, tartalmát
  2. Használja a Regex szűrőket az src attribútum megkereséséhez és a könyvtár nevének összefűzéséhez a file:// protokollal
  3. Használja a html elemzőt a DOM bejárására és az src attribútum módosítására.

Kösz.

30.10.2014

Válaszok:


1

Ha van egy konzisztens dolog a Stack Overflow-ban, az az, hogy ha megpróbálja elemezni a DOM-ot egy reguláris kifejezéssel, akkor kiabálni fog.

Van azonban egy ötletem, amely egy reguláris kifejezést használ minta keresésére a html-ben, és beilleszthet egy elemet, amely megoldhatja a problémát.

Amit megtehetsz (és 20 éve nem csináltam C++-t, szóval ezt muszáj lesz kódolnom), az az, hogy megkeresed a head címkét, és hozzáadhatsz egy base elemet, amely megad egy alap URL-t az összes képhez és horgonyhoz.

Regex regex = new Regex('</head>', RegexFlag.CaseInsensitve);
sHtml = regex.replace(sHtml, "<base href=\"http://www.base.com/" /></head>");

Ez azt feltételezi, hogy mindig van fejcímkéje, és a fejelem jól formált. Előfordulhat, hogy először ellenőriznie kell, hogy a regex valóban talál-e valamit, és ha nem, akkor tegyen valami hasonlót a html elem kezdőcímkéjével, és ha nem találja jól... szemét, szemét ki.

És fing, egy alapelem már létezhet. Tehát érdemes lehet egy regex cserét ezen is: <base[^>]*>. Csak cserélje ki egy üres karakterláncra.

További információ az alapelemről: http://webdesign.tutsplus.com/articles/quick-tip-set-relative-urls-with-the-base-tag--cms-21399

... nyilván kevésbé hanyag megoldás a DOM-elemző használata, de ennek röviden működnie kell.

30.10.2014
  • Tudom, hogy a regex nem jó ötlet, csak kíváncsi vagyok, mi a jó. Akit érdekel, íme a gyors, regex cserekód str = ‹img id=\ctl00_RelatedLibrary_RelatedResults_ctl01_Thumb\ src=\/script/ResearchLibrary/Logos/LibraryItemThumbnail_93_100x130.png\; std::tr1::regex rx((‹img[^›]+src=\)([^\›]+)); std::string csere = $1file://newpath$2; std::string str2 = std::tr1::regex_replace(str, rx, csere); 30.10.2014
  • Ha reguláris kifejezést használ az src frissítéséhez a képeken, végül kihagy egy esetet, kivéve, ha a dokumentumok formázásának konzisztenciájában nagyon biztos lehet. Ehelyett kipróbálnék néhány tesztdokumentumot, és megnézném, hogy a base megoldja-e a problémát, és ha igen, akkor próbálja ki az általam javasolt megoldást. 30.10.2014
  • Nyilvánvalóan az alap URL-t egy file:// URL-re szeretné beállítani a kérdésben szereplő ötlet szerint. A <head><title></title></head> kötelező, így az alkatrésznek biztonságosnak kell lennie. 30.10.2014

  • 2

    Köszönöm @Daniel az egyszerű javítást. Amikor először létrehozom a dokumentumot, amit az about:blank-ban használok üres oldalhoz, majd állítsa be a baseurl-t arra a könyvtárra, amellyel dolgozni akarok. Próbáltam a file://-t használni, de nem működött. Ezért a teljes elérési út nevet használtam. Még egyszer köszönöm @Daniel és @MSalters, hogy segítettek. Akit érdekel, itt a kód.

    m_Browser.Navigate( _T("about:blank") ); //navigate to blank document
    IDispatch* pDispatch = m_Browser.GetHtmlDocument();
    
    //Only if a resource or web page is loaded can we get the document
    if( pDispatch != NULL )
    {
        IHTMLDocument2* pHtmlDoc;
        HRESULT hr = pDispatch->QueryInterface( __uuidof( IHTMLDocument2 ), (void**)&pHtmlDoc );
        pDispatch->Release();
        if( SUCCEEDED( hr ) )
        {
    
    // Create a safearray to store the HTML text
    CComBSTR    bstrURL;
    CComVariant varDummy;
    SAFEARRAY      *pSA;
    SAFEARRAYBOUND  saBound = {1, 0};
    pSA = SafeArrayCreate(VT_VARIANT, 1, &saBound);
    
    
    
    // Copy the HTML into the one and only element
    VARIANT   *pVar;
    CComBSTR   bstrHTML = "<html><head><base href=\"C:\\\"></head><body>Hello!</body></html>";              // Load the text
    varDummy = bstrHTML;                        // .. into a variant
    
    SafeArrayAccessData(pSA, (void**)&pVar);    // Access safearray data
    pVar[0] = varDummy;                         // Set the text data
    SafeArrayUnaccessData(pSA);                 // Release access
    
    // Write the HTML as the document's new text
    pHtmlDoc->write(pSA);                           // Overwrite HTML
    SafeArrayDestroy(pSA);
    pHtmlDoc->close();
        }
    }
    
    31.10.2014
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..