Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   13.10.20 17:43

Ich versuche seit zweit Tagen einige bmp's die für den Programmlauf nötig sind in eine DLL zu schmeissen. Nur die nötigsten um Unordnung vorzubeugen. Habe dazu den ResourceHacker nenommen und einfach die Bilder rein und speichern. Das Vorhaben funktioniert so aber nicht. Es hagelt Fehlermeldungen das die dll defekt sei. Irgendwas habe ich da wohl nicht verstanden.

Als Umweg habe ich mit dem RH dann zu testzwecken ein paar BMP's in die kompilierte EXE gepackt. Das funktioniert auch sehr gut. Auch wenn die Datei nun 25MB groß ist. Nur sind eben diese Bilder nach erneutem kompilieren wieder futsch. kann man also nur machen wenn das Programm soweit auch fertig ist. Fält jetzt noch aus.

Wie erstelle ich denn nun eine dll mit Bildinhalten?
und eine weitere Frage: kann ich eigentlich auch eine mp3 in diese dll packen? Funktionieren tut es ja. Aber wie greife ich dann auf die mp3 zu?
Ginge das überhaupt?

Gruß aus Castrop
M.Barkholz

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: p. specht (---.nat.highway.telekom.at)
Datum:   13.10.20 18:44

Noch nicht probiert, aber ich habe ein Wiki dazu gefunden:
https://wiki.delphigl.com/index.php/Bilder_als_Ressourcen

Dort wird ein Programm namens PE Ressource Explorer ungültig verlinkt,
Dieses 32bit-Programm ist auch nicht mehr sonstwo verfügbar, als Ersatz wird
https://www.chip.de/downloads/Resource-Editor_71937653.html
empfohlen.
Gruss

____
Ein richtiges Problem hat keine Lösung, nur Näherungen!

Nachricht bearbeitet (13.10.20 18:53)

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   13.10.20 19:38

Ja, die Bitmaps gehen ja gut.
Im Reshacker bitmap als Typ und den
Namen angeben. Im Programm dann
Handle = Create ("hPic", 0, "RESSOURCENNAME")
laden und mit DrawPic anzeigen.

jpg scheint der ResHacker nicht zu machen.
Da würde ich es mit RCDATA als Ressourcentyp versuchen.
Dann mit Res("Info",..) und Res("Size",..) das Handle und
Größe ermitteln. Damit dann einen Bereich dimensionieren
und mit Res("Get",..) laden.

Hier mal ein Beispiel, wie man mit CatchImage sowas bekommt :


 $H Windows.ph
  Declare bereich#,x&,y&,z&,p&,text$
 
  Def GetSysColor(1) !"USER32","GetSysColor"
  SetTrueColor 1
 
  Proc CatchImage
 
      Struct GdiplusStartupInput = GdiplusVersion&,DebugEventCallback&,SuppressBackgroundThread&,SuppressExternalCodecs&
      Var GDIP& = ImportDll("Gdiplus.dll","")
      Var OLE& = ImportDll("Ole32.dll","")
      Var Kernel& = ImportDll("Kernel32.dll","")
      Declare gdpsi#,gdiplusToken&,ImageObject&,GraphicObject&,pStream&,RetVal&
      Parameters MemPointer&,Size&
      'GDIPlus starten
      Dim gdpsi#,GdiplusStartupInput
      gdpsi#.GdiplusVersion& = 1
      gdpsi#.DebugEventCallback& = 0
      gdpsi#.SuppressBackgroundThread& = 0
      gdpsi#.SuppressExternalCodecs& = 0
      GdiplusStartup(ADDR(gdiplusToken&),gdpsi#,0)
      Dispose gdpsi#
      'Speicher bereitstellen
      Var m_hBuffer& = GlobalAlloc(2,Size&)
      Var pBuffer& = GlobalLock(m_hBuffer&)
      RtlMoveMemory(pBuffer&,MemPointer&,Size&)
      GlobalUnlock(m_hBuffer&)
      'Stream erzeugen
      CreateStreamOnHGlobal(m_hBuffer&,1,Addr(pStream&))
      GdipCreateBitmapFromStream(pStream&,Addr(ImageObject&))
      'hBitmap erzeugen
      GdipCreateHBITMAPFromBitmap(ImageObject&,Addr(RetVal&),0)
      'aufräumen
      Var Command& = Long(pStream&,0)
      call(Long(Command&,8),pStream&)'IStream.Release
      GlobalFree(m_hBuffer&)
      GdipDisposeImage(ImageObject&)
      GdipDeleteGraphics(GraphicObject&)
      GdiplusShutdown(gdiplusToken&)
      FreeDll GDIP&
      FreeDll OLE&
      FreeDll Kernel&
      Return RetVal&
 
  EndProc
 
 Declare mem#
 Dim mem#,3184
 Clear mem#
 
 Long mem#,0=-520103681,1179258880,16795209,16777217,256,-2080318465,117836032,151389960,168298248,218827018,202182422,337317132,538316821,539107869,606019357,606876712,522662182,758983967,976696625,7237289 54,943670335
 Long mem#,84=976827459,168427831,218893578,437194522,622798135,926365495,926365495,926365495,926365495,926365495,926365495,926365495,926365495,926365495,926365495,926365495,926365495,-1057016009,528640,630 45827,33563137
 Long mem#,168=285409553,12910337,65564,16843522,1
 Long mem#,192=50331648,84017412,-16251130,272564420,50397696,100926721,117703177
 Long mem#,224=50462976,86053124,1900097810,-2124328685,841094150,606310707,-1586343372,1121042865,-1839983262,1142294512,-1300073645,419480831,16843009,65793
 Long mem#,288=33619968,-16448509,287441092,33554689,84082946
 Long mem#,316=285344000,70324739,336806177,-10399438,51118298,285343745,1056968963,8977152,-1265159412,-576544138,900166699,1703038918,-378361971,-997991342,481939429,-1996370642,-338862369,-1266991759,-10 80298205,-729860621
 Long mem#,396=-334465079,-1252113199,1793769336,-945291009,292019887,378513849,-484953810,-491902053,-134591989,-934292067,2145300431,737388953,-1259927294,-1155735122,-1997891414,-743776746,1459011218,231 878195,-594413268
 Long mem#,472=-1034360275,-1118399367,271993425,-835827287,1809679235,-874267635,1469628345,-1094029999,-303704113,-460336272,1907563887,-1441023193,424324749,1261801213,777344058,-1509122606,-1771322967,- 357260040,-1180885685
 Long mem#,548=411390857,1160374733,-1697769026,229835636,-1946978137,350218633,1834508991,1828510763,-700871947,-307793455,1474787659,347202716,1809278471,-1965578139,-1321577988,793678482,-1136856279,1716 225878,1416837724
 Long mem#,624=-1109074268,-686749985,8389121
 Long mem#,640=2033152,-728901832,-1024353352,-1205047264,1905851114,934849832,2007374603,-1485104048,-789523814,-303589756,286342933,1442877585,-1077641835,603799482,911873927,576008682,-1208602979,-143655 4658,2006245065
 Long mem#,716=-111985514,-1537893828,714986218,776878221,2089472818,-1698266759,-1414473810,-1231280274,-475868428,-1232007193,-1540704402,-1102497301,-449791285,2093406946,1337843961,-1802710939,101233808 3,1530395083,-892740314
 Long mem#,792=801009008,382230394,-1953565203,-1427906295,715298885,-1472670412,-1776000571,-2145249734,966142170,-1466553521,731261138,1706310480,-281916737,393995590,-949524325,1387765
 Long mem#,860=-2129722624,478154643,905299367,-1694860234,1692795028,-623956722,1008893482,-1568842478,-920460633,-1111422832,1976285496,986516083,363961458,606860690,-1684564846,278342187,-374598438,-1672 161447,979217015
 Long mem#,936=1154712184,-67378533,1803243442,-1029083023,145208119,448933323,1661040585,1069131443,-248508893,1459071029,312479364,-299524918,-1150557131,1395098247,688463388,-320959402,-138287171,7435152 65,1892590161,247730937
 Long mem#,1016=-673609827,1479235926,1496715260,42,100663296,522584863,-547604224,869207123,50438924,1047490848,27874261,-1428492483,112339957,-828977541,-810968925,288794526,2073008862,-2066574277,6654218 72,1313347874,-2137640124
 Long mem#,1100=341464683,-804039833,341464753,225197994,-315237668,1517386267,1528510874,526231487,-1412217368,-1531487383,-1528431196,-1153937013,-404378062,-1392443546,-594614731,-1920071082,1499316367,- 261771420,-1470047940
 Long mem#,1180=-427687936,718461682,-756468393,-1308850609,2077995666,393637686,-1507351148,-187774701,-1382173306,-1296247720,-1745414694,845822899,-1282959448,-1240073814,-707144626,-1115335638,-16323077 79,-717850861,-2033736416
 Long mem#,1256=205725008,206798799,125895072,1786639646,1723421359,976612855,1838473360,1088167019,1944635882,-992749652,1283144121,-359315062,1294878413,-752472351,-1184348271,-2036148662,-1183791438,3295 8433,-1468884421
 Long mem#,1332=-173168151,-911006187,-107773968,-2066224620,139172197,-1522344989,-555071393,1448102209,-1402607244,1834175078,-881040007,-1905013193,-2103469024,1756345888,-231249591,-1514490076,-88409443 8,-534561781,1231678835
 Long mem#,1408=1262907201,182200234,-171801190,2073808616,1455858365,-2095752433,1231016389,-935649771,-832646666,1609993034,177655047,-855146506,8391318
 Long mem#,1464=-1590337524,-905840496,-1281688964,1642761007,1912602772,1742083951,1797426644,-174459483,926059060,860991904,-1679953286,-2117637818,1422709022,1325465450,-368306938,-959075819,1537811317,1 622495881,-2052170189
 Long mem#,1540=-1488006040,-1536551535,1455236948,456788061,986538202,2094928810,336133523,1172600735,1256842864,-1510481356,-972885086,-1095201852,-1188371061,-1967503374,-851241020,-1553846406,90831933,- 494166088,1166968698
 Long mem#,1616=389967126,1511009435,1915891580,160
 Long mem#,1636=-274238880,-1525832130,-1414935569,234930216,-855979411,683867898,1652416986,423740527,-702856942,636754595,-1830979250,-1720141342,283330948,1970997679,-639018229,927640919,1974720273,-2091 912362,-418046777
 Long mem#,1712=-343317671,-157026442,-1380819013,1412893266,-958932941,-82522191,1698492115,-1294825771,1131799464,1498614159,-993990517,1557388198,-160911977,-406981008,-640232764,2068410177,1519090797,12 09607214,-686191138
 Long mem#,1788=-697034071,-1113512091,-1722040899,-1752968850,1568285839,1830925207,1418323222,16774270,1044089730,-967091243,-555253237,-619918341,-855463039,670286511,2130228512,21030244,144,15728896,-10 5030642,-1788594827
 Long mem#,1868=-359495133,916611276,-2124287987,1521724623,1877013574,-911460014,-1030976480,-1559713500,1686733428,1409852886,-1667068797,318248031,1501512100,-376130096,601114364,-359156523,1278047563,-1 433539662,-1540540843
 Long mem#,1944=-1289454626,-1450367267,1784171372,696134057,1733013860,-146954286,966767418,-799576246,-1787892070,-1666865988,331846504,-1825065667,925485980,-195663261,-1834834711,576352329,1762220126,-1 211513705,1746447702
 Long mem#,2020=115393496,1768138717,-1151956166,-471446838,-394668774,-1904658549,634890957,1734561181,-900902578,-247567495,-1263840092,-460012886,-1195037525,-1115294291,-244253554,2107843929,-1455969198 ,-106787755,-363992920
 Long mem#,2096=-1437271724,1039194044,655699533,-1556643609,695817077,-1948473375,-161792569,2029772414,-485028393,839409066,2031616,-69277952,1221227285,1179104387,1236110058,-1612545081,-1079392887,14776 68430,2065076331
 Long mem#,2172=718561620,-1981674001,-1573083662,-1634065832,-768685333,-1957531542,1680071968,-1855052660,-1264367596,-809044514,1912668065,164264931,1987223731,-1135563577,1839447475,1997858386,-42718493 ,-1548174107,-445384647
 Long mem#,2248=-1906172420,1807196115,-916808377,1399505251,1593207387,-4406042,-161228544,-309480138,1973801214,-1444058501,-2074915376,2022939556,-1935545909,-107157842,-1311860429,-1425841959,-183211962 4,539805976,-240863328
 Long mem#,2324=1800077819,1168593501,628996570,-1374144680,-28013596,-886867428,-1280107027,1671231086,1787647001,669242491,-445028833,2043859859,-1459812443,-1007438261,444767150,1873404565,2123583554,-16 88543510,712814762
 Long mem#,2400=937355585,-1457936657,-1630476816,1105783326,1117248595,1805856059,463819381,984207738,-522366120,1432214680,-262249520,176196662,-1271523580,532092846,311923819,1529481072,332571182,4400329 07,1451622655,-1074147077
 Long mem#,2480=964750304,-1097473761,-23379979,-93525747,1792845044,982148933,-1584330112,2092431955,778157977,1073764596,242073256,955358919,1073139718,-888210979,1745066180,1742607803,545886130,115352166 7,1519684180,-2035166852
 Long mem#,2560=921685255,1228884797,-775433431,-1817555254,-143879450,1057832692,-1272475710,1453401725,1807590902,1951659047,-225683991,-948929837,-606784753,-2055271684,-680425858,-901922877,-1414538791, 410733010,-369029177
 Long mem#,2636=-456221708,-141566093,940395740,1738521377,-143107481,-1850750679,2113429491,-188883532,-1418571811,1334237131,2127027621,-377768746,-1001947447,1907891581,-1175896917,1022971986,746486044,- 1406255749,-1814210614
 Long mem#,2712=1196123469,-371080768,-2108539795,363931373,-181145434,-1375892289,15252989,10501364
 Long mem#,2756=-1016822271,1935402755,-1517860252,-661176940,-808170148,-109571283,-320868706,402109428,1533633512,-412176941,1314101557,114261329,1204370989,2132541695,1319586114,-1231140018,1462900888,11 75287604,158313438
 Long mem#,2832=2128931649,-447358597,75213581,1381636081,-219514482,1523766141,-1144811826,248177001,926872873,622980530,-561335782,-462163844,1803220464,-673686033,216591006,-742239830,-92720397,-32376632 9,-103283968
 Long mem#,2924=-1271648504,-826761299,-1029104779,-1478942324,-1816980293,1881821867,1271014804,-2047155188,1569463276,626823178,-709380055,-453772191,-1372711592,-1697436635,-737294462,-1195683380,-152381 6498,1730752198,-1378705854
 Long mem#,3000=-1511869577,-1566777770,1867856120,-1086813451,-1802882061,-1515961667,-122947891,1537109043,2019522972,-729880135,1247131304,1906224766,1826722219,1765078760,2072765614,-681913733,152845464 4,1506496570,-1842943332
 Long mem#,3076=1420072680,-1174034972,742912211,-742156301,-892893757,79860450,-1153859477,12631662,10112829
 Long mem#,3128=1639359232,-69538791,-904835119,-1269042231,1348718995,1605327886,-648220250,902687396,1675174594,-1070813583,1969082172,1475813687,1694877896,55807
 
 
 
  Declare hBild&
  hBild& = CatchImage(mem#,sizeof(mem#))
 
  Dispose mem#
  Window 0,0
  ' *** Bild anzeigen
  DrawPic hBild&, 0,0, 1
  Window %BmpX + 100 ,%BmpY + 100
 
  While 1
    waitinput
    Case %key=2:Break
  Endwhile
 
  '*** Bild freigeben
  '
  DeleteObject hBild&
 
  END
 


Vielleicht kannst du es ja brauchen. Brauchst ja nur die Proc, den
Bereich hast du ja in einem Bereich, der aus der Ressource stammt.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   18.10.20 19:11

Zitat:


und eine weitere Frage: kann ich eigentlich auch eine mp3 in diese dll packen? Funktionieren tut es ja. Aber wie greife ich dann auf die mp3 zu?


Natürlich kannst du über RCDATA auch eine mp3 in die DLL packen.
Da geht alles, auch eine DLL (z.B. Listview.dll) mit Funktionen.

Die Datei lädst du über Res("Size",..) und Res("Get",..) in eine
Bereichsvariable. Die mußt du halt mit BlockWrite temporär
schreiben, damit du mit mciSend$() bzw. ImportDLL arbeiten kannst.

Am Programmende würde ich die Datei einfach wieder löschen.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   19.10.20 20:56

Hallo Heinz!

Danke für die Tipps. Das mit den mp3 finde ich recht interessant. Bisher liegen die Musik/Sounds im Verzeichnis des Programms. Das stört mich ein wenig. Deshalb die Idee die mp3 in eine dll packen.

Ich arbeite viel mit der bass.dll. Dort werden die mp3 so übergeben:

hStream& = BASS_StreamCreateFile(0,"0.mp3",0,0,0,0,0)

Ich komme aber nicht zurecht. Wie wende ich denn Res("Size") und Res("Get",..) an damit ich die entsprechend dem BASS_StreamCreateFile so zuweisen kann das es auch abspielt?

Hast Du da ein kleines Beispiel für das Ausführen eben dieser 0.mp3 für mich?

Ich weis echt nicht wie ich mit den Befehlen + Blockwrite umzugehen habe.

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   21.10.20 18:13

Die bass.dll mußt du schon wieder in deinen Programmordner
schreiben. Die bass.dll würde ich gleich mit den mp3's als Ressource
dazu packen. Das ganze würde dann so aussehen, wenn die DLL
BASS als Ressourcenname hätte :

 DEF %RT_RCDATA 10
 hdll = UseDLL("DeineDLL.dll")
 
 info& = Res("Info", hdll, %RT_RCDATA, "BASS", 0)
 groesse& = Res("Size", hdll, info&, "BASS", 0)
 Dim mem#,groesse&
 mem# = Res("Get", hdll, info&)
 
 BlockWrite "BASS.DLL", mem#, 0, SizeOf(mem#)
 


Nach dem gleichen Muster verfährst du mit deinen mp3's.

PS : Hab dir gerade noch die MemoryModule.zip gemailt.
Damit bräuchtest du die DLL gar nicht erst auspacken, sondern
könntest die Funktionen im Speicher (mem#) direkt aufrufen.
Kannst dir auch mal anschauen.

Zum Abspielen von mpeg :
 
 
 mci$ = mcisend$("OPEN 0.mp3 TYPE MPEGVIDEO ALIAS TEST")
 mcierr$ = mcisend$(mci$)
 
 Case %MCIError : MessageBox(mcierr$,"Fehler beim Öffnen",0)
 
 mcisend$("PLAY TEST WAIT")
 
 
 


H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (21.10.20 18:19)

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   21.10.20 21:02

Das ist ja richtig genial!

Damit werde ich mich am Wochenende beschäftigen. So langsam läuft alles so wie ich es mir vorgestellt habe.
Muss noch einige Proceduren mit oGL-Animationen basteln und entsprechend in eine passende Chronologie verpacken. Dann wird meine Bessere Hälfte endlich ihre Diashow bekommen.

Ich danke Dir für die Hilfe!

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   23.10.20 18:42

Allgemeine Frage zu dieser resourcen-dll die ich erstelle möchte. Wird diese dll beim Aufruf eigentlich komplett in den speicher geladen?

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   24.10.20 12:29

Zitat:


Wird diese dll beim Aufruf eigentlich komplett in den speicher geladen?


Ich denke, schon. Wird wohl das gleiche sein, wie bei einer
.exe, die an einer Adresse im Speicher steht. Die Sprungadressen
für Funktionen o.ä. berechnet normalerweise der Compiler /Linker.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   24.10.20 20:42

Das ist super!

Das beseitigt dann zusätzliche Arbeit. Du erinnerst Dich vielleicht an mein altes Problem das Bilder nachladen den Programmablauf stoppte, bis sämtliche Bilder geladen wurden?
Damit dürfte das Problem mit unterschiedlichen Threads arbeiten zu müssen nun auch Geschichte sein.
Habe nämlich gemerkt das meine dll viel schneller lädt als die ganzen Einzelbilder und danach viel effizienter darauf zugegriffen werden kann.

So soll es sein. :-)

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   25.10.20 07:31

Wenn es nur Bilder und keine Videos sind, könnte man da
ziemlich effektiv arbeiten. Mit MCI mußt du halt die Videos
von Platte nachladen.

Andernfalls bietet XProfan ja eine Menge Möglichkeiten an.
z.B. Arrays von Bereichen usw. Auch ein Array, das die Handles
der Bilder enthält kann da gute Dienste leisten.

Also, beim Programmstart soviel wie möglich initialisieren
und Ressourcen laden.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   26.10.20 11:37

Ja, danke für den Tipp!

Mit den Videos habe ich das etwas anders realisiert. Ein zweiter Prozess, bzw Fenster als eigenständiger Thread wird gestartet und über das Erste gelegt. Im zweiten Fenster wird dann das Video abgespielt und zum Ende einfach ausgeblendet oder eine andere Animation gestartet. Fällt nicht auf und es kann im Hintergrund initialisiert werden. Ich weis zwar nicht ob das die beste Vorgehensweise ist aber es läuft gut und schnell. Das Gleiche hatte ich mit den Bildern gemacht bevor ich auf die Idee mit der dll kam. Ging dann auch, gefiel mir aber nicht weil die Bilder einfach in einem Unterverzeichnis des Programmordners lagen. Das dauerte mir einfach zu lange.

Habe mir auch die ProSpeed.dll angesehen. Sternenfeld erzeugen geht recht einfach. Danke auch für diesen Tipp. Habe es später aber dann doch durch ein parallax scrolling mit reinem xProfran sogar besser hinbekommen.

Und die Handles in ein Array packen, hmmh. Ich glaub das baue ich auch mal ein.

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   26.10.20 16:26

Wieviel Bilder sind es denn ?
Sind die alle etwa gleich groß (Länge, Breite) ?

Interessant wäre natürlich auch die ImageListe von XProfan.
Damit kann man ja nicht nur ICON's verwalten. Zudem hätte
man das Zurechtschneiden (falls nötig) gespart.

 ilist& = Create("ImageList", DX, DY)
 bilder& = ImageList("Add", ilist&,  CatchImage(mem#,SizeOf(mem#)))
 WhileLoop 1, bilder&
    DrawIcon ilist&, &LOOP, X, Y
 EndWhile
 


Evtl. funktioniert sowas .
Müßte man mal ausprobieren.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   26.10.20 19:01

Mit Imagelist funktioniert es nur mit Icons bzw.
Bitmaps, die aus Einzelbildern zusammengesetzt
sind (TOOLBAR + TOOLBAR32).

Andererseits ist das andere auch keine große Sache :

 Declare  Mem Bereich[], Handle hdll, bilder[], info, Long groesse, X
 Declare String Pics[]
 DEF %RT_RCDATA 10
 
 Pics[] = Explode("WOOD1,WOOD2,WOOD3", ",")
 
 hdll = UseDLL("E:\StarTreck\Trecki.dll")
 X = 10
 Dim Bereich[], 1000
 
 Window 800, 400
 
 WhileLoop 0, SizeOf(Pics[]) -1
   info = Res("Info", hdll, %RT_RCDATA, Pics[&LOOP], 0)
   groesse = Res("Size", hdll, info)
   Setsize Bereich[], groesse
   Bereich[&LOOP] = Res("Get", hdll, info)
   bilder[&LOOP] = CatchImage(Bereich[&LOOP],SizeOf(Bereich[&LOOP]))
 EndWhile
 
 WhileLoop 0, SizeOf(bilder[]) - 1
     DrawSizedPic bilder[&LOOP], X, 20 - 180, 100; 0
     Inc X, 200
 EndWhile
 
 WaitKey
 FreeDLL hdll
 Dispose Bereich[]
 


H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (26.10.20 19:06)

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   26.10.20 20:56

Ich habe noch keine Ahnung wie viele Bilder es werden sollen. Könnten aber durchaus 200 sein.
Die Bilder haben so ziemlich alle die gleiche Größe. Also 1920x1080. Manche sind aber Portaits. Da muss ich mir noch was einfallen lassen damit das automatisch erkannt wird.

Ich werde Deinen Vorschlag gleich ausprobieren

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   02.11.20 19:42

Hallo Heinz,

ich habe mal dieses Beispiel zum Testen benutzt und beiße mir die Zähne aus:

  DEF %RT_RCDATA 10
  hdll = UseDLL("DeineDLL.dll")
  
  info& = Res("Info", hdll, %RT_RCDATA, "BASS", 0)
  groesse& = Res("Size", hdll, info&, "BASS", 0)
  Dim mem#,groesse&
  mem# = Res("Get", hdll, info&)
  
  BlockWrite "BASS.DLL", mem#, 0, SizeOf(mem#)
 


Ich bekomme immer die Fehlermeldung "Bereichsvariable mem#" nicht deklariert.
Natürlich habe ich die Deklaration in Form von Declare mem# gemacht. Trotzdem geht es nicht. Erstaunlich finde ich auch, das ich zum Test den Code einfach in meinen Deklarationsteil am Anfang des Programms zwischen den Zeilen 20 - 30 kopiert und getestet habe. Merkwürdig ist die Ausgabe des Fehlers: Mir wird der Fehler in unterschiedlichen Zeilen jenseits der 1100 angezeigt. (Zeilenzahl ist hier sogar noch variabel)
Ich habe aber keine Codezeilen jenseits der 1000.

Kommentiere ich BlockWrite aber aus, funktioniert der Code. Wo steckt denn da der Fehler?

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Michael Wodrich (---.customer.vsm.sh)
Datum:   03.11.20 01:25


cls

Declare long hdll
Declare mem#
Declare info&
Declare groesse&

DEF %RT_RCDATA 10

hdll = UseDLL("C:\TEMP\DeineDLL.dll")

info& = Res("Info", hdll, %RT_RCDATA, "BASS", 0)
groesse& = Res("Size", hdll, info&, "BASS", 0)
Dim mem#,groesse&
mem# = Res("Get", hdll, info&)
' BlockWrite "C:\TEMP\BASS.DLL", mem#, 0, SizeOf(mem#)

print "hdll:",hdll
print "info:",info&
print "groesse&:",groesse&
waitkey
end


Als DLL habe ich die bass.dll einfach mal umbenannt.

Ergibt alles Null, außer dem Handle bei hdll

--
Programmieren, das spannendste Detektivspiel der Welt.
Programmierumgebung: | XProfan (neueste) | Win (neueste)


Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   03.11.20 16:48

Was geben denn die Variablen info& und groesse& aus ?
Vielleicht ist der Ressourcenname falsch geschrieben und
und die Res-Funktionen geben dann 0 zurück, was einen
undimensionierten Bereich zur Folge hat.
Ich habe zwar die BASS.DLL nicht, hatte es aber mit einer
anderen DLL probiert und es hat geklappt.

Natürlich muß das UseDLL erst danach erfolgen.

Könnte aus meiner Sicht aus nur ein kleiner Schreibfehler
o.ä. sein. Sowas passiert mir auch öfters mal.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   03.11.20 18:25

Okay, Fehler gefunden!

War kein Schreibfehler, sondern eine Verwechslung (Ich Tr*t**l!). Man sollte vielleicht vorher die DLL aus der die Daten extrahiert werden mit ImportDLL und nicht mit UseDLL in den Speicher bringen. Dann funktioniert das auch perfekt.

Danke für den Hinweis

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   03.11.20 18:31

Sieht so aus, daß der Fehler erst auftritt, sobald eine
andere Funktion/Prozedur auf die Bereichsvariable
zugreift.
Ich habe damit etwas gespielt und festgestellt, daß
man durchaus eine Bereichsvariable mit 0 dimmen
kann, ohne einen Fehler zu erhalten. Erst beim Zugriff
einer anderen Funktion führt erst zum Fehlerfall.
Sogar ein SizeOf(mem#) funktioniert.

 Declare mem#, groesse&
 Cls
 
 groesse& = 0
 Dim mem#, groesse&
 Print SizeOf(mem#)
 'BlockWrite "E:\Test.dat", mem#, 0, SizeOf(mem#)
 waitkey
 Dispose mem#
 End
 


Ich denke, daß Roland hier unbedingt für Abhilfe sorgen sollte.
Erstens sucht man sich einen Wolf und zweitens können da
unbestimmte Dinge passieren, die man vielleicht gar nicht
möchte. Vor allem für Anfänger und Unerfahrene User ist
das nicht besonders zugänglich.

Abschließend würde ich sagen, daß man unbedingt vor der
Verarbeitung von Bereichsvariablen die Größe mit SizeOf()
überprüfen sollte. Trotzdem sollte dieser Bug von Roland
gefixt werden und nicht noch eine falsche Fehlermeldung
produzieren.
Niemand arbeitet ja mit einem Bereich, der 0 Byte Größe hat.

PS: Außerdem sei noch gesagt :
Wer mit dem ResHacker seine Ressourcen bearbeitet bzw.
einfügt, der sollte bei RT_RCDATA aufpassen. Da kommt
in das Feld TYP nur RCDATA rein. Andernfalls legt der ResHacker
einfach einen neuen Typ z.B. RT_RCDATA an und speichert
ihn auch so. Da der TYP dann bei Windows unbekannt ist,
bzw. die API ihn nicht kennt, kommt dann 0 bei den Res()-
Informationsfunktionen (Info + Size) heraus. Das wiederum
erzeugt dann obigen Fehlerfall mit dem Bereich.

Gruß Heinz

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (03.11.20 18:52)

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: David Strutz (87.123.192.---)
Datum:   03.11.20 22:11

Heinz Brill schrieb:

> Niemand arbeitet ja mit einem Bereich, der 0 Byte Größe hat.

Bei GMEM_MOVEABLE markiert man das Speicherobjekt per "0" als "verworfen", was durchaus so gedacht ist; und dann gibts ja auch noch globalrealloc:

(https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-globalrealloc)

So würde uns das Unmöglichmachen dieser "0" einschränken/ Features verdecken sodass Roland sie imho nicht "verweigern" sollte.

Liebe Grüße, David.



XProfan & FreeProfan rox: http://xprofan.net/



Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   04.11.20 17:04

Zitat:

Man sollte vielleicht vorher die DLL aus der die Daten extrahiert werden mit ImportDLL und nicht mit UseDLL in den Speicher bringen. Dann funktioniert das auch perfekt.


UseDLL funktioniert bei mir aber perfekt. Ist ja auch speziell fürs
Ressourcen-Laden gedacht. ImportDLL ist ja mehr dafür gedacht,
alle Funktionen einer DLL zu importieren.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   04.11.20 23:04

Merkwürdig. Bei Usedll funktioniert es leider überhaupt nicht. Hab es soebend nochmal versucht. Sei es drum. Es geht ja. Habe den Code nochmal umgeschrieben um etwas zu testen:

 Proc mp3_write
     Parameters name$
     Declare RAM#, info&, size&
 
     DEF %RT_RCDATA 10
     info& = Res("Info", MP3, %RT_RCDATA, name$, 0)
     size& = Res("Size", MP3, info&, name$, 0)
     Dim RAM#, size&
     RAM# = Res("Get", MP3, info&)
 
     Assign #1, name$ + ".mp3"
     OpenRW #1
     BlockWrite #1, RAM#, 0, SizeOf(RAM#)
     Close #1
     Dispose RAM#
 Endproc
 


Mir ist klar das ich seit x4 auch nur blockwrite nutzen kann aber es gibt da noch ein problem:

Wie man sieht, werden hier meine mp3 aus der dll, die zuvor global initialisiert wurde in das Programmverzeichnis geschrieben. Jeweils einzeln bei jedem Aufruf. Über den String name$ werden die dateinamen übergeben. Habe es so gestaltet das die dateinamen zufällig ausgesucht werden, je nach Thema der Diashow. Songs passen zu den Bildern.
Nach betätigen von ESC werden sämtliche dll und Bereichsvariablen disposed. Zum schluss wollte ich mit:

     WhileLoop 1,5
       assign #1, str$(&loop) + ".mp3"
       Erase #1
     EndWhile
 


Die entsprechenden mp3 wieder aus dem Programmverzeichnis löschen. funktioniert aber nicht. Die mp3 bleiben nach beendigung bestehen.

Baue ich zum Test assign und erase hinter dispose ram# testweise in die proc mp3_write ein, funktioniert es problemlos.

Nur in der WhileLoop geht es nicht.


Die bass.dll und alle anderen + Variablen Disposed -wurde also alles komplett entladen, der Zugriff auf die mp3 besteht also nicht mehr. Im Explorer kann ich aber bei geöffneten profan-programm die mp3 löschen. Da kommt also keine Meldung "Datei wird noch benutzt"

Jemand eine Idee warum?

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   05.11.20 16:13

Lass mal das Gedöns mit Assign #, openrw # , close # weg.
BlockWrite arbeitet auch mit Dateinamen. Das Öffnen und
Schließen übernimmt es auch. Auch Erase verträgt einen
Dateinamen.

Und wenn du es absolut damit machen möchtest, dann auch
bitte pro Kanal (#) auch nur eine Datei. Hast ja 99 zur Verfügung.
Die Dateinummern bzw. Kanäle (#) sind ja dazu gedacht, schnell
zwischen den Dateien zu wechseln, z.B. mit Print #, ..
Ein typisches Szenario wäre, die alte Datei, die Datensätze mit Löschzeichen (*)
hat, zu öffnen und zu lesen und im gleichen Zug die nicht gelöschten
mit IfNot Instr("*", zeile) ... Print #2, zeile in eine andere
Datei zu schreiben.

Ich glaube, mich zu erinnern, daß es da mal irgendwelche
Probleme gab. Ob die behoben wurden, weiß ich leider
nicht mehr.

H.Brill
XProfan X4 + FreeProfan

Nachricht bearbeitet (05.11.20 19:00)

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   05.11.20 20:05

hmhh, geht auch nicht

In diesem Codeabschnitt hab ich versucht zu löschen. Keine Chance!

   If IsKey(27)                                                                          'Wird die ESC-Taste gedrückt...
     'BASS_Init(-1,44100,0,0,0)
     BASS_ChannelStop(hStream&)
     BASS_Free(0)                                                                        'bass.dll beenden
     FreeDll BASS                                                                        'bass.dll wieder freigeben
     Dispose fft#                                                                        'fft-Variable aus Speicher entfernen
     FreeDll DLL                                                                         'ProSpeed.dll wieder freigeben
     FreeDLL BMP                                                                         'RES.dll mit Bilder aus Speicher entfernen
     FreeDLL MP3                                                                         'mp3.dll aus speicher entfernen
     KillTimer
         WhileLoop 1,5
       Assign str$(&loop) + ".mp3"
       Erase str$(&loop) + ".mp3"
     EndWhile
     End
 


Wie gesagt, selbst während des Laufenden Programms kann ich die mp3's löschen. In xProfan geht es auch dann nicht, wenn der Programmpfad mit &progDir noch zusätzlich ergänz wird.

Stimmt da was mit der WhileLoop nicht?

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Markus Barkholz (---.hsi05.unitymediagroup.de)
Datum:   05.11.20 20:17

Jetzt geht's!

Habe den Code jetzt so:

   If IsKey(27)                                                                          'Wird die ESC-Taste gedrückt...
     WhileLoop 1,5
       Erase $progdir + str$(&loop) +".mp3"
     EndWhile
     BASS_ChannelStop(hStream&)
     BASS_Free(0)                                                                        'bass.dll beenden
     FreeDll BASS                                                                        'bass.dll wieder freigeben
     Dispose fft#                                                                        'fft-Variable aus Speicher entfernen
     FreeDll DLL                                                                         'ProSpeed.dll wieder freigeben
     FreeDLL BMP                                                                         'RES.dll mit Bilder aus Speicher entfernen
     FreeDLL MP3                                                                         'mp3.dll aus speicher entfernen
     KillTimer
     End
 


Damit klappt es. Schon merkwürdig. Eigentlich dachte ich es wäre sinnvoll das Löschen erst nach dem Entladen und Disposen zu machen.

Beitrag beantworten
 
 Re: Bilder in eine dll linken
Autor: Heinz Brill (---.dip0.t-ipconnect.de)
Datum:   06.11.20 16:28

Ja, wie schon gesagt :
Das Assign # ... brauchst du nicht und das Erase
arbeitet auch mit Dateinamen.

Das Assign ist nur nötig bei einer einzelnen Datei, in die
du mit Print #1 etwas schreiben möchtest. Oder halt, um
mehrere Dateien offen zu halten, indem man in einer Datei
liest und in die andere Datei schreibt. Da braucht man halt
nur den Kanal (#) zu ändern.

H.Brill
XProfan X4 + FreeProfan

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org