Speicherleck bei Load_BMP_From_Mem()

  • Moin

    Load_BMP_From_Mem() verschlingt komischerweise Speicher...

    Ich weiß leider nicht, wie man das Problem beheben kann...

    Als Beispielskript habe ich mal eins gemacht, was einen Smiley aus der Ressource läd und auf den Bildschirm bringt.
    Dabei wird in einer Endlosschleife unmengen Hauptspeicher vollgemacht. Also bitte nur ein Paar sek laufen lassen und dann mit Return beenden.

    Spoiler anzeigen
    [autoit]

    #include <Memory.au3>
    #include <GDIPlus.au3>
    #include <winapiex.au3>

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Global $dc = _WinAPI_GetDC(0)
    Global $gr = _GDIPlus_GraphicsCreateFromHDC($dc)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Not _IsPressed('0D')

    [/autoit] [autoit][/autoit] [autoit]

    $bmp = Load_BMP_From_Mem(_res())
    _GDIPlus_GraphicsDrawImageRect($gr, $bmp, @DesktopWidth/2 - 50, @DesktopHeight/2 - 50, 100, 100)
    _GDIPlus_BitmapDispose($bmp)

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDispose($gr)
    _WinAPI_ReleaseDC(0, $dc)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Func _IsPressed($a)
    Local $b = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', '0x' & $a)
    Return BitAND($b[0], 0x8000) <> 0

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_IsPressed

    [/autoit] [autoit][/autoit] [autoit]

    Func _res()
    Local $a = ''
    $a &= '0x89504E470D0A1A0A0000000D49484452000000320000003208060000001E3F88B10000000467414D410000B18E7CFB5193000000206348524D0000870F00008C0F0000FD520000814000007D790000E98B00003CE5000019CC733C857700000A396943435050686F746F73686F70204943432070726F66696C65000048C79D96775454D71687CFBD777AA1CD30025286DEBBC000D27B935E456198196028030E3334B121A2021145449A224850C480D150245644B1101454B007240828311845542C6F46D68BAEACBCF7F2F2FBE3AC6FEDB3F7B9FBECBDCF5A170092A72F9797064B0190CA13F0833C9CE911915174EC0080011E608029004C5646BA5FB07B0810C9CBCD859E2172025F0401F07A58BC0270D3D033804E07FF9FA459E97C81E89800119BB339192C11178838254B902EB6CF8A981A972C66182566BE284111CB893961910D3EFB2CB2A398D9A93CB688C539A7B353D962EE15F1B64C2147C488AF880B33B99C2C11DF12B1468A30952BE237E2D8540E33030014496C1770588922361131891F12E422E2E500E048095F71DC572CE0640BC49772494BCFE173131205741D962EDDD4DA9A41F7E464A5700402C300262B99C967D35DD252D399BC1C0016EFFC5932E2DAD24545B634B5B6B434343332FDAA50FF75F36F4ADCDB457A19F8B96710ADFF8BEDAFFCD21A0060CC896AB3F38B2DAE0A80CE2D00C8DDFB62D3380080A4A86F1DD7BFBA0F4D3C2F890241BA8DB1715656961197C3321217F40FFD4F87BFA1AFBE67243EEE8FF2D05D39F14C618A802EAE1B2B2D254DC8A767A433591CBAE19F87F81F07FE751E06419C780E9FC313458489A68CCB4B10B59BC7E60AB8693C3A97F79F9AF80FC3FEA4C5B91689D2F81150638C80D4752A407EED07280A1120D1FBC55DFFA36FBEF830207E79E12A938B73FFEF37FD67C1A5E225839BF039CE252884CE12F23317F7C4CF12A0010148022A9007CA401DE800436006AC802D70046EC01BF8831010095603164804A9800FB2401ED8040A4131D809F6806A50071A41336805C741273805CE834BE01AB8016E83FB60144C80676016BC060B10046121324481E421154813D287CC2006640FB941BE50101409C54209100F124279D066A8182A83AAA17AA819FA1E3A099D87AE4083D05D680C9A867E87DEC1084C82A9B012AC051BC30CD809F68143E0557002BC06CE850BE01D7025DC001F853BE0F3F035F8363C0A3F83E7108010111AA28A18220CC405F147A29078848FAC478A900AA4016945BA913EE426328ACC206F51181405454719A26C519EA850140BB506B51E5582AA461D4675A07A51375163A859D4473419AD88D647DBA0BDD011E8047416BA105D816E42B7A32FA26FA327D0AF31180C0DA38DB1C2786222314998B59812CC3E4C1BE61C6610338E99C362B1F2587DAC1DD61FCBC40AB085D82AEC51EC59EC107602FB0647C4A9E0CC70EEB8281C0F978FABC01DC19DC10DE126710B7829BC26DE06EF8F67E373F0A5F8467C37FE3A7E02BF4090266813EC08218424C2264225A1957091F080F0924824AA11AD8981442E7123B192788C789938467C4B9221E9915C48D124216907E910E91CE92EE925994CD6223B92A3C802F20E7233F902F911F98D0445C248C24B822DB141A246A2436248E2B9245E5253D24972B564AE6485E409C9EB92335278292D291729A6D47AA91AA99352235273D2146953697FE954E912E923D257A4A764B0325A326E326C99029983321764C62908459DE242615136531A29172913540C559BEA454DA21653BFA30E506765656497C986C966CBD6C89E961DA521342D9A172D85564A3B4E1BA6BD5BA2B4C4690967C9F625AD4B8696CCCB2D957394E3C815C9B5C9DD967B274F9777934F96DF25DF29FF5001A5A0A710A890A5B05FE1A2C2CC52EA52DBA5ACA5454B8F2FBDA7082BEA290629AE553CA8D8AF38A7A4ACE4A194AE54A57441694699A6ECA89CA45CAE7C46795A85A262AFC255295739ABF2942E4B77A2A7D02BE9BDF4595545554F55A16ABDEA80EA829AB65AA85ABE5A9BDA4375823A433D5EBD5CBD477D564345C34F234FA345E39E265E93A199A8B957B34F735E4B5B2B5C6BAB56A7D694B69CB69776AE768BF6031DB28E83CE1A9D069D5BBA185D866EB2EE3EDD1B7AB09E855EA25E8DDE757D58DF529FABBF4F7FD0006D606DC0336830183124193A19661AB6188E19D18C7C8DF28D3A8D9E1B6B184719EF32EE33FE6862619262D26872DF54C6D4DB34DFB4DBF477333D3396598DD92D73B2B9BBF906F32EF317CBF4977196ED5F76C78262E167B1D5A2C7E283A59525DFB2D572DA4AC32AD6AAD66A84416504304A1897ADD1D6CED61BAC4F59BFB5B1B411D81CB7F9CDD6D036D9F688EDD472EDE59CE58DCBC7EDD4EC9876F576A3F674FB58FB03F6A30EAA0E4C870687C78EEA8E6CC726C749275DA724A7A34ECF9D4D9CF9CEEDCEF32E362EEB5CCEB922AE1EAE45AE036E326EA16ED56E8FDCD5DC13DC5BDC673D2C3CD67A9CF3447BFA78EEF21CF152F26279357BCD7A5B79AFF3EEF521F904FB54FB3CF6D5F3E5FB76FBC17EDE7EBBFD1EACD05CC15BD1E90FFCBDFC77FB3F0CD00E5813F06320263020B026F0499069505E505F30253826F848F0EB10E790D290FBA13AA1C2D09E30C9B0E8B0E6B0F970D7F0B2F0D108E3887511D7221522B9915D51D8A8B0A8A6A8B9956E2BF7AC9C88B6882E8C1E5EA5BD2A7BD595D50AAB53569F8E918C61C69C8845C786C71E897DCFF4673630E7E2BCE26AE366592EACBDAC676C4776397B9A63C729E34CC6DB'
    $a &= 'C597C54F25D825EC4E984E7448AC489CE1BA70ABB92F923C93EA92E693FD930F257F4A094F694BC5A5C6A69EE4C9F09279BD69CA69D96983E9FAE985E9A36B6CD6EC5933CBF7E137654019AB32BA0454D1CF54BF5047B8453896699F5993F9262B2CEB44B674362FBB3F472F677BCE64AE7BEEB76B516B596B7BF254F336E58DAD735A57BF1E5A1FB7BE6783FA86820D131B3D361EDE44D894BCE9A77C93FCB2FC579BC337771728156C2C18DFE2B1A5A550A2905F38B2D5766BDD36D436EEB681EDE6DBABB67F2C62175D2D3629AE287E5FC22AB9FA8DE93795DF7CDA11BF63A0D4B274FF4ECC4EDECEE15D0EBB0E974997E5968DEFF6DBDD514E2F2F2A7FB52766CF958A6515757B097B857B472B7D2BBBAA34AA7656BDAF4EACBE5DE35CD356AB58BBBD767E1F7BDFD07EC7FDAD754A75C575EF0E700FDCA9F7A8EF68D06AA83888399879F049635863DFB78C6F9B9B149A8A9B3E1CE21D1A3D1C74B8B7D9AAB9F988E291D216B845D8327D34FAE88DEF5CBFEB6A356CAD6FA3B5151F03C784C79E7E1FFBFDF0719FE33D2718275A7FD0FCA1B69DD25ED40175E474CC7626768E7645760D9EF43ED9D36DDBDDFEA3D18F874EA99EAA392D7BBAF40CE14CC1994F6773CFCE9D4B3F37733EE1FC784F4CCFFD0B11176EF506F60E5CF4B978F992FBA50B7D4E7D672FDB5D3E75C5E6CAC9AB8CAB9DD72CAF75F45BF4B7FF64F153FB80E540C775ABEB5D37AC6F740F2E1F3C33E43074FEA6EBCD4BB7BC6E5DBBBDE2F6E070E8F09D91E891D13BEC3B537753EEBEB897796FE1FEC607E807450FA51E563C527CD4F0B3EECF6DA396A3A7C75CC7FA1F073FBE3FCE1A7FF64BC62FEF270A9E909F544CAA4C364F994D9D9A769FBEF174E5D38967E9CF16660A7F95FEB5F6B9CEF31F7E73FCAD7F366276E205FFC5A7DF4B5ECABF3CF46AD9AB9EB980B947AF535F2FCC17BD917F73F82DE36DDFBBF077930B59EFB1EF2B3FE87EE8FEE8F3F1C1A7D44F9FFE050398F3FCBAC4E8D3000000097048597300002E2200002E2201AAE2DD920000001974455874536F667477617265005061696E742E4E45542076332E352E314EE738F900001122494441546843ED99775454D7DAC6676862D7888DD84BAE1A6B44408D35D805542496688C8929F60A562CD8506C28A0580322222822228A8A622F8894993943B1C4281A0B9A6B079C79EEF3C2B056BE7CF9560266DDEF9FCC5ABFB5A79C7DCEFBBC6DEF7346A5FAE7F58F07FEF1C07FCD03037BD897215DC94CB29DC490B3E43889203E6424A9F75F33EAAF5E8846552483C901F29CC0D5C91E5FBA3A62C270478C1FE680EFDDED306E881DBE74B1C7E05EF6906388421693E644FD57AFF7DEC7F162E6A42D994BFCC816729264BBF4E8F0CECDC90E9E633BE2F0BA36C80EAD8F077B6A20777715FC1262839CEDD5F0D396EAD0FAD7C1719F8FB065565BCC1DDB012307D8C3B9A7FDAF3CC756D2F4BD8DFC2B27E085A6933724920C2527C4B3C3FA3B62D9447B8C1EF8097CC7FD0BF7FCCAE06DB025F282AD91B7BB2CDF97C3AB6D65F03CC01CCFFCD478B4CE0C396BAD70C7B71C327DAA60EFD486F8DEB59D44E819994CACFE8A3DA53EC694DF92E363C80397CFECB1747227DC8A690B83660CB2767E84EF87B4C177FD5A22795125BC8BAD0A1CA90A6374651823CAC3B0B71C0A8229729B055E0698E1B99F199EAE51E3C1523532E75A62D7B87A18DACBCEC073EF21354B6DE89F4D34A5D604898A5B1F0784AFEE8897973AC37899DC8B82F1941DEE85DB60B44B7B7CDDA715D216578421A92E70B93E90680B1CAF09C4DA00FBABC0185601EF765AE37580051EAD52E3E7452A64CE54E1E8781B7C3DB0BD44E72AA9FB673695EA779E7812C91F39D01157C2BA203F6B0670270086B8A6F47A59E05425E04A75A41D6804F77E1D30B97F33DC5CCF88689B02698DF85B43E002459DFA90826A304A9591B7DD1AB96BCD7177890A591E6A683D3FC0C5D94D30D9A5B5884921B54B65ECFF358927EC49DE7EDECF0157F7D8C3F0700F602C80F1EA6818F69701E22B005769A09EA26EB7406C48070CEEED08FF61B6C83D5C1DC66CFEA6303A1A0A49A2A8C4BA30F2FB8290F278E16F89072B54B831D702BAB935A159D20697A6D7C3C4012D458CB46C8BBF458C849864BA3A39203EA01D8D9A00FCB29FD10885E1701D188F301A17AA03D96D8147AEC0CB0930BC9886D0A041F86670179C9B5401053AA695F20190CEBA49A1A8CB0D18195B1863AA213FB82C9EAE57E3B6971ACAACB248F7B445FAB24E3831CE16A3FB14368139EF2D8427511369B3F09B6D8782CB6D604CF986C633CFA3AC618CA588335580D43A404E67E0AD17237502301CC2DBC723B1D4B31B56BBD5C3FD5D8C98BE1A8CA92CFCEB14748562CEB06E8E568721A202FEED6F86BBCB54C8986986D449D648F56A8724AF2E08FDA6295C7ADAE7F2FA2DDF4B0C4F60475E8F7476C4D3638D5010D788294163A2994EB1E5982295816B35801BCCFFC79F301A5F02054114B41C78DA038F591F1743EAE3CEC6B230EA3EA0133837A9028C5738EF34051DE577911412A0468E0F0BDE438594EFD5B83EED43247BF7C1D5059DE031A495446577A98598BA549833A371D0B725F20F57434184058C8728E228459C67244444563D18EF3781E17E63E05927E039D32B97D179C022CFA947581B37995A1482944A781C5F11DE139AE3595439A616A3BACF1ABFFAAB71977592EE618ED83115B079583D788DE88C296E9D316E4061177B4DDA964A0C27D6232FC6B8DAE3498C2DF2F65AC21065C988309D'
    $a &= '12D8A1922942614ADDA0A1D91C6FD1E847AD80272D808714F590517AC45AB85DBB488486C2932B20EF6C19787DDB1C53DD3FC6C185B638E2550BBB26DA62C5C88658E8D618AB86D6C39661B5B17B544DEC1D65839D236A62BE6B1311B3A6B442C64B6D6CF4688DFC2395911F66C66858C1185F1EB82886898126148E59CCFB9C0630E6D42714754F04B2CDEAA405B3C8D3447C7918CF5BE231D3D2E7CB869832A019BC5C1B21F80B1B5C1C6F85CC592AE867A9A199551DD7E7B7C7F565BD717D7137C4793A88906C52BEC46238294E8424EFA88F37E11678B78F42E2CAC09828ADB61AD384E9924634B568A8A40E3B979E51CA207AB65CA9897436050D85A452C4753AE01AD3E91CD333D102AFA3CC717F3553CA5B857BCBC94A157E667ADDE2E2A89B570B29CB9C90B2DA0D292B06E2AAAF33463B3B1A694FBB1209E1844AE4CE30AE1B8FA32AE1D58F6AE453C8BB238CC85916EB657A3889AB742A05A48B20BE4FA3D1692C627626A9055CAFC8E2AE0423D3492281648A60348C89E6302458E0ED7E355EEF56E1E576157237A9F060B50A7729E686970ADA99EC5C4BBB20D59742560F41CAC661DC647695A84C28A990969CF46AFAA87678B6D71A2F77AA90176E8682582BBC3BC57DD3391A78A90A72136B2323BA0E0CC96CADD768787245B6561A7CC99A6B85892436866BAC2B8944821A8693E6C83B6886577B282258855F835478E4A7C2FDB58C0885642FA0906916DCE2B4A7108A58330CA9815F61C7DC9E22646B8984B87CE6E82469B5FCBBE67812648E57BCE05B46E46D3477B5B16550105F1686C48A5839B905DC7ADB212D80422E315217D9852E306A8288B94A11491471DE0238A1E2124367C498E1CD5E8A60349ED341B9812A3C9688AC677A71DF7563A1396BA43CD2BC1D90BA7608198EB4A0EFB0DFDB4984249448C8E0DE9F0E77EEE988C0C94DF1988BD50BA6D6CB300A22AF23CCF196F95DC07A39E3571B3EC31B207DB6150ACE718D384F216768F445B6E82B147099E379B32211F12A188EA891B75F5528E4C58F8CC6D62221B98CCAFD0D6CBF4BACA15F580EBA055CDD5774459A08593F0AE9BBA6E0E092EE2224AD44425C9D3A8E1221DBA636C1A34D1678BA558D17C114B49B30255E8531D528263FC612CF432CF162AF150CC799FF27292281869F25E7CCB960AA1905729422E2D4787788F32255781DCE6850C8530A784A31BF3022BAA59670EFD51E7EA3EA433BBF0ED2573951C850A46DFE019AE01988F2722CBCAB2C91104E1822A9B5617C333CDC6885275BCCF1EF1DBC3853EC7908615ABCA131792CD8FC283681432CE0583158CDED3ABD9F2069448E913815DE1D666A1EA480083A818E7821694521CF58E88F19919F59E8598CC686314D70E4BB8AD07856A1905E48DB3002E9BBE743B36B1A22E6142E8CC92515D299930C4BBEFA171EAC53530C6F82E8B95F29E61979CADC2E1443C3DED2C3922EF9D1F4780C3D1F2B2954348A803C0A78B98F73E9845CE950DBC816159E04B02E984E7729E2E65233642FB5817E79536899569A25AD90BE6600D2377F074DE42A282193113ABD7003195352218D39E9D9DCD12D90C3BB38E9280F19FE279BE941F2D0BF68FC955E154112A597CC7BF1F81B0A13816F68FC4BA6A0887EC4637FE19C0734FE3E3B548EAF0A7764CD584A115C37B21659F3B6B73194351DA15DDE1EDAB5FDA0F11F054DC81C68A2372263F764AC1F5FB828FA96548895E4E317DCE7DCF2B52ABCB0707F5D11920AF728EE01C589C04734F00923F68C463FA5C745A4189EC363EFAE2A5AE8A4B5DE213F71977B438CE77A21642EB040A6774D64AEB7876E435F6837B8421BF435B43FCE80F6E07A0AD9848CE06F3073849D08195622217230276D933AB9B4A42A4558B235D210AEC062C8CDC5842BF22DBE17AF8A9162F02FB21EB08D4ABAFCC4636FF2CEEFC642AE0D850693F9DCAACF2573F89E63E63C0B642CAC8ACCB59F20639B3B74DBC640B76B1274A173A03DB00A9AB8EDD044AC44CA2667B8F7EEF096F6D4298D1057111238814F46D655C5CFCB79F32386990CCA9C2786D0AB344E8C152FDFE683845BDE5C0BC4DBFC5E7ED7D368C5935D895B741DF7528A305B0DFD3C2B642CB241C6EA96C80C72857EF704E8C23CA0DBB708BAA835D0C56D8536762B743F4E41A4472789C67952F2272C9C5481DCFECAD90E99819FE0A795157063B159A1817A1A25061653E46535B2E6CA1391A2F719622CD1799A518019B43338CE3487D6C312BAD965A12C6071FBB647C67677E8C3A640D9371FBAFDCBA03BBC11DAF85DD01E0F6654D641D9E48239C3DBC93E6B7C89A3614A2DB93B5CCCFB1163985777DC0E6C8FEC15B599265CB43CCD69143D4B410A1F1A28B3CDE8F5DFC2DF3D790FEE6945CAF2A1427968E75486765EF5C2C54E3BBF16742B5A42D93A14FABDD3A0442C80EEC04A462108BA93A1D02584417B6C1774C13391B0A43D063B75C8A12D354A25C424A6164F706F149F086A4346236B632764AD6E0DBD775D7AB60C34DC1369A6D3608F22B4B32C8915294328C08302668B801AD02EE442B7E42368BD3F82CEA72D942D6E50C26640899454F2812E7E0794C44828A72328641F74D1EB707B575F4C195AB87ECC2FB588E2893CC90FE4DDCA292E5082C732158643BF65109495AD685C23681634A087E9657A5AE755346A177CC8DFF8BD18BEBC15343E6CA93E76D0ADEA00C5BF3F945D63A184CF662A2D8572D017CAB16D50CE1C80FEB40839C0CF3B706BFFB7D83AA3B0E5A691AA7F87106B9EE898CB670ED8BCE00B64442D'
    $a &= '4246B807F4E1B3981A23A1040C856E7D5FD21B3ABF3ED012DD467EF61F085DE0208EFDA1DBD497B93E9002BE8176DF0268C4F8980D5062FD69F44E2867A32820929108878EB5712B7A16629777C5905E0E05BC7697F716F19BA8D4E009F5DC832178C578282776427F34084AFC76282C50258C851A4A0F87525C28D38514BE0F99C6AE3309CA1E0F284C1FE5F88FD08BE759034AC2DEC22828E70F71A49013A1D0C70751C40C5CF0EB8A11FD1C0A0674EFB09036989B30E3284FEDDFEFC93D85B42059437A77C20E9FA9D09D3B04FDD5D3D0279D2E32483C7B3800BA83EB08DBE7A10DEC4001D0722DB816B71BC7C2B7E1C2517AFDC2112817E3C85128176239773FF4744CF6F175B8133B11096B7AE02B677B43DF2EEDFD6B54AB5C8D86572065491962F9B788A29066442791D9B0880BD7E5E3C8D0A52343AB4146DA35645C3B0BFDC563F4FAC1A27C4F3C806BC723E1337F2A268E198A6B27250231D0339532CEEC43C6E910649D0AC2CD935CFCF64FC1164F27DEDF381ABA7668B9C7CAD2A22D8D6E44E419702D22A22A91722651F204B2384A25CF3E595DA566F8BFC6BB39E3062131D21F19574F22239D424414D16B53292C09FA944B483E771CBCB9E123D4CE38B26F07F457E29179E508B2AE4423EB22D3EB5420A2032763D6989E18D0DDEE45CB8F1A849B99994DA46563891BE9445A13F9FF4444491BAE6C12541CA152A59BFAC39AD56A767768EDCD1C7E3EBCFFA7F09DE98E0BA19EB8713A0037926290957A16999A24646AAF43D12463E7E60D58BF723152AF9E4766DA3964A5C423FB72184E862DC5FC499FC3AD4F2774B1FBF8BE4DD54A9134501EFB789379641619430611297A79E228519287DBD2C9243A22462253E29778A321B1AF6553D59D06ECEBD7CD2E97B7C718E7DE03BEB30621DAEF2B24B2F8AF44AFC4B563814CAF6DB81CBB0909A18B10B16E1C7CA60FC2D76EDD30B0A783A4D1C3BAB56DCEA8D5EA709E730FD941369155C493FC601233946347D282D42712194935A91D6908257E599B4E2427ED4E03FA54AD5CE1CBD6CD1A6EEA66DFEA52BFAE76FC2BCD21DFC5A9A3D1AD6F670C1BF029860FEC0277BE77FEACA3A17F77FBBC1E8EAD1FB769D630BDFA07958F9A9B9B150B90C7A2DB4D225672948E35937C4B461167D28134FF9D10B1A7544244B9149AEC44ED4937D29BB890CF2D2CCCC7D6AE5E7561D306B6412D9AD43BC49C3FD9BC71DD787E8EB3AD512DB25CD9323B795C20D96C1AFD39AE27ABC90AB2847890A944D26A30F98CB4378968C051FED12A4E2DD948962AB54448F14BDAA208122F7D423A9B2EDA9FA3AB082352B49388E4FB6C32D784FC5D209FC568F94D0C17EF8F20E27D719038AA0D6946249D6D890D9194926B8B088946A98A9DF3FEC74B4E22795AC574A1C61C3F26D269E4C9A01D71209F921EA417E967422229DF4967128FB732192D1D4A8A5AFE8F17E3AB13894045522CE0FDDAEFEF55FC812809B37412E928E23911285E14C42041D604A1F8FBE251BEFBC03447E6CA6228E7913A10EF8BF11281BF6795FF1331F2B344492E26C885C5001127C61423512C460C2D7E2FBFCBB1C21F19FEB7A4D15FD0F0BF0E29DE1FFD762C16F947E3EF8F2FCD35FF99F3FFEE81FF0000E4E4ED959015A50000000049454E44AE426082'
    Return $a
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Load_BMP_From_Mem($pic)
    Local $memBitmap, $len, $tMem, $hImage, $hData, $pData, $hStream, $hBitmapFromStream
    $memBitmap = Binary($pic)
    $len = BinaryLen($memBitmap)
    $hData = _MemGlobalAlloc($len, 0x0002)
    $pData = _MemGlobalLock($hData)
    $tMem = DllStructCreate("byte[" & $len & "]", $pData)
    DllStructSetData($tMem, 1, $memBitmap)
    _MemGlobalUnlock($hData)
    $hStream = _WinAPI_CreateStreamOnHGlobal($pData)
    $hBitmapFromStream = _GDIPlus_BitmapCreateFromStream($hStream)
    $tMem = ""
    Return $hBitmapFromStream
    EndFunc ;==>Load_BMP_From_Mem

    [/autoit] [autoit][/autoit] [autoit]

    Func _GDIPlus_BitmapCreateFromStream($pStream)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $pStream, "int*", 0)
    Return $aResult[2]
    EndFunc ;==>_GDIPlus_BitmapCreateFromStream

    [/autoit]

    Mein System ist WinXP.
    Es kann sein, dass unter 7 oder Vista alles läuft (bezweifle ich aber).

    lg
    Mars(i)

  • Das Scheint ja eine Musterlösung für das Problem zu sein :)


    Genau :D
    Die Funktion im ersten Beitrag war übrigens die erste, mit der man ein Bild aus dem Speicher laden konnte.

  • Ist mir nie aufgefallen, dass Load_BMP_From_Mem() ein Memory Leak hat! Habe i.d.R. nur einmal n Bilder geladen, somit ist das mir nie aufgefallen!

    Danke an progandy für die fehlerfreie Lösung. :thumbup:

    Hier meine Version ohne Memory Leak:

    [autoit]


    ;======================================================================================
    ; Function Name: Load_BMP_From_Mem
    ; Description: Loads a image which is saved as a binary string and converts it to a bitmap or hbitmap
    ;
    ; Parameters: $mem_image: the binary string which contains any valid image which is supported by GDI+
    ; Optional: $hHBITMAP: if false a bitmap will be created, if true a hbitmap will be created
    ;
    ; Remark: hbitmap format is used generally for GUI internal images
    ;
    ; Requirement(s): GDIPlus.au3, Memory.au3
    ; Return Value(s): Success: handle to bitmap or hbitmap, Error: 0
    ; Error codes: 1: $mem_image is not a binary string
    ;
    ; Author(s): UEZ
    ; Additional Code: thanks to progandy for the MemGlobalAlloc and tVARIANT lines
    ; Version: v0.95 Build 2011-06-11 Beta
    ;=======================================================================================
    Func Load_BMP_From_Mem($mem_image, $hHBITMAP = False)
    If Not IsBinary($mem_image) Then Return SetError(1, 0, 0)
    Local $declared = True
    If Not $ghGDIPDll Then
    _GDIPlus_Startup()
    $declared = False
    EndIf
    Local Const $memBitmap = Binary($mem_image) ;load image saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count associated with a memory object that was allocated with GMEM_MOVEABLE
    Local $hStream = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0)
    $hStream = $hStream[3]
    Local $hBitmap = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    $hBitmap = $hBitmap[2]
    Local Const $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
    "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    If $hHBITMAP Then
    Local Const $hHBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap)
    If Not $declared Then _GDIPlus_Shutdown()
    Return $hHBmp
    EndIf
    If Not $declared Then _GDIPlus_Shutdown()
    Return $hBitmap
    EndFunc ;==>Load_BMP_From_Mem

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    4 Mal editiert, zuletzt von UEZ (12. Juni 2011 um 10:05)