<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[ايران ويج - BASIC]]></title>
		<link>https://www.iranled.com/forum/</link>
		<description><![CDATA[ايران ويج - https://www.iranled.com/forum]]></description>
		<pubDate>Thu, 12 Nov 2026 04:41:00 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[محیط ترمینال]]></title>
			<link>https://www.iranled.com/forum/thread-31445.html</link>
			<pubDate>Fri, 24 Nov 2017 12:17:42 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-31445.html</guid>
			<description><![CDATA[سلام<br />
<br />
همگی خوبین؟  <img src="https://www.iranled.com/forum/images/smilies2/biggrin.gif" alt="خنده بلد − بهینه شده برای ورژن جدید" title="خنده بلد − بهینه شده برای ورژن جدید" class="smilie smilie_88" /> <br />
<br />
همونطور که میدونین برای ارتباط محیط بیرون (مثل میکروکنترولر) با کامپیوتر نیاز به یه نرم افزار آشکارسازی مثل ترمینال هستش که خود ترمینال انواع مختلفی داره ..<br />
<br />
نرم افزار بسکام هم خودش یه محیط ترمینال برای اینکار داره<br />
<br />
حالا سوال من اینه که میخوام دیتاهایی رو که در محیط ترمینال ثبت میشه همزمان روبروی هر سطر از دیتا <span style="font-weight: bold;" class="mycode_b">زمان و تاریخ</span> هم بصورت اتوماتیک ثبت بشه<br />
<br />
چطوری اینکارو انجام بدم؟<br />
<br />
با ترمینال خود بسکام میشه اینکارو کرد یا یه ترمینال دیگه میخواد؟<br />
<br />
عکسهای زیر رو بعنوان مثال میذارم ، شماره یک ترمینال معمولی خودشه اما شماره دو رو دستی تاریخ و ساعت گذاشتم که میخوام مثل همین باشه ..<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/image.gif" title="JPEG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=13933" target="_blank">1.jpg</a> (اندازه:  61.99 KB / تعداد دفعات دریافت:  98)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/image.gif" title="JPEG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=13934" target="_blank">2.jpg</a> (اندازه:  88.74 KB / تعداد دفعات دریافت:  98)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[سلام<br />
<br />
همگی خوبین؟  <img src="https://www.iranled.com/forum/images/smilies2/biggrin.gif" alt="خنده بلد − بهینه شده برای ورژن جدید" title="خنده بلد − بهینه شده برای ورژن جدید" class="smilie smilie_88" /> <br />
<br />
همونطور که میدونین برای ارتباط محیط بیرون (مثل میکروکنترولر) با کامپیوتر نیاز به یه نرم افزار آشکارسازی مثل ترمینال هستش که خود ترمینال انواع مختلفی داره ..<br />
<br />
نرم افزار بسکام هم خودش یه محیط ترمینال برای اینکار داره<br />
<br />
حالا سوال من اینه که میخوام دیتاهایی رو که در محیط ترمینال ثبت میشه همزمان روبروی هر سطر از دیتا <span style="font-weight: bold;" class="mycode_b">زمان و تاریخ</span> هم بصورت اتوماتیک ثبت بشه<br />
<br />
چطوری اینکارو انجام بدم؟<br />
<br />
با ترمینال خود بسکام میشه اینکارو کرد یا یه ترمینال دیگه میخواد؟<br />
<br />
عکسهای زیر رو بعنوان مثال میذارم ، شماره یک ترمینال معمولی خودشه اما شماره دو رو دستی تاریخ و ساعت گذاشتم که میخوام مثل همین باشه ..<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/image.gif" title="JPEG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=13933" target="_blank">1.jpg</a> (اندازه:  61.99 KB / تعداد دفعات دریافت:  98)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/image.gif" title="JPEG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=13934" target="_blank">2.jpg</a> (اندازه:  88.74 KB / تعداد دفعات دریافت:  98)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[محیط بسکام]]></title>
			<link>https://www.iranled.com/forum/thread-30855.html</link>
			<pubDate>Sat, 27 Aug 2016 12:10:43 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-30855.html</guid>
			<description><![CDATA[سلام<br />
برای تو محیط بسکام وقتی = رو میذارم ارور زیر رو بهم میده<br />
این مشکل سازه؟!<br />
باید چکارش کنم<br />
<div style="text-align: left;" class="mycode_align">There was an error during the execution of this program.</div>
<div style="text-align: left;" class="mycode_align">The application might become unstable and even useless.</div>
<div style="text-align: left;" class="mycode_align">It's recommended that you save your work and close this application.</div>
<div style="text-align: left;" class="mycode_align">Access violation at address 008D7965 in module 'bascavr.exe'. Read of address 00000000</div>]]></description>
			<content:encoded><![CDATA[سلام<br />
برای تو محیط بسکام وقتی = رو میذارم ارور زیر رو بهم میده<br />
این مشکل سازه؟!<br />
باید چکارش کنم<br />
<div style="text-align: left;" class="mycode_align">There was an error during the execution of this program.</div>
<div style="text-align: left;" class="mycode_align">The application might become unstable and even useless.</div>
<div style="text-align: left;" class="mycode_align">It's recommended that you save your work and close this application.</div>
<div style="text-align: left;" class="mycode_align">Access violation at address 008D7965 in module 'bascavr.exe'. Read of address 00000000</div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[برنامه موتور پله ای با بیسکام]]></title>
			<link>https://www.iranled.com/forum/thread-30351.html</link>
			<pubDate>Sat, 12 Dec 2015 15:15:14 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-30351.html</guid>
			<description><![CDATA[سلام خدمت شما دوستان عزیز.<br />
استاد ما چند تا تمرین به ما داده ولی متاسفانه توضیحی در موردشون نداده و اصلا بلد نیستم برنامه هاشو بنویسم.میخواستم کمکم کنید.لطفا کمکم کنید که تا فردا بیشتر وقت ندارم.<br />
<br />
الف- برنامه چرخش یک موتور پله ای 4 قطب با زاويه پله 1.8 درجه با کنترل تمام پله را به صورتی تغییر دهید که موتور تنها نیم دور بچرخد.<br />
<br />
ب-برنامه چرخش یک موتور پله ای 4 قطب با زاويه پله 1.8 درجه به طور دائم با کنترل نیم پله را به زبان بيسيك در محیط BASCOM-AVR بنویسید.<br />
<br />
 ج-برنامه اولیه را به گونه اي تغيير دهيد كه وضعيت يك كليد را در ورودي خوانده و بسته به آن جهت چرخش موتور را تغییر دهد یعنی اگر يك بود موتور پله ای را ساعتگرد و اگر صفر بود موتور پله ای را پادساعتگرد بچرخاند.<br />
<br />
د- برنامه نمایش یک متن ثابت را روی LCD متنی 16*2 بنویسید.<br />
<br />
ایشاالله هر چی از خدا میخواهید بهتون بده]]></description>
			<content:encoded><![CDATA[سلام خدمت شما دوستان عزیز.<br />
استاد ما چند تا تمرین به ما داده ولی متاسفانه توضیحی در موردشون نداده و اصلا بلد نیستم برنامه هاشو بنویسم.میخواستم کمکم کنید.لطفا کمکم کنید که تا فردا بیشتر وقت ندارم.<br />
<br />
الف- برنامه چرخش یک موتور پله ای 4 قطب با زاويه پله 1.8 درجه با کنترل تمام پله را به صورتی تغییر دهید که موتور تنها نیم دور بچرخد.<br />
<br />
ب-برنامه چرخش یک موتور پله ای 4 قطب با زاويه پله 1.8 درجه به طور دائم با کنترل نیم پله را به زبان بيسيك در محیط BASCOM-AVR بنویسید.<br />
<br />
 ج-برنامه اولیه را به گونه اي تغيير دهيد كه وضعيت يك كليد را در ورودي خوانده و بسته به آن جهت چرخش موتور را تغییر دهد یعنی اگر يك بود موتور پله ای را ساعتگرد و اگر صفر بود موتور پله ای را پادساعتگرد بچرخاند.<br />
<br />
د- برنامه نمایش یک متن ثابت را روی LCD متنی 16*2 بنویسید.<br />
<br />
ایشاالله هر چی از خدا میخواهید بهتون بده]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Qbasic Source Codes]]></title>
			<link>https://www.iranled.com/forum/thread-29019.html</link>
			<pubDate>Mon, 13 Oct 2014 12:40:10 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-29019.html</guid>
			<description><![CDATA[درود<br />
<br />
در این تاپیک سورس کد های qb قرار خواهد گرفت.<br />
<br />
نکته:سورس ها برای ویندوز نوشته شده اند اما امکان اجرای اکثر ان ها بر روی سیستم عامل های دیگر امکان پذیر میباشد.<br />
<br />
موفق باشید.]]></description>
			<content:encoded><![CDATA[درود<br />
<br />
در این تاپیک سورس کد های qb قرار خواهد گرفت.<br />
<br />
نکته:سورس ها برای ویندوز نوشته شده اند اما امکان اجرای اکثر ان ها بر روی سیستم عامل های دیگر امکان پذیر میباشد.<br />
<br />
موفق باشید.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[HP Basic]]></title>
			<link>https://www.iranled.com/forum/thread-27317.html</link>
			<pubDate>Mon, 18 Nov 2013 11:42:21 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-27317.html</guid>
			<description><![CDATA[با سلام<br />
من پروژه ای دارم که در آن از زبان HP Basic استفاده شده است. برنامه موقع اجرا error میگیرد. نیاز به کسی دارم که کمک کند تا مشکل را پیدا کنم. لطفا از افرادی که به این زبان آگاهی دارند خواهش میکنم پیام بدن. <br />
با تشکر]]></description>
			<content:encoded><![CDATA[با سلام<br />
من پروژه ای دارم که در آن از زبان HP Basic استفاده شده است. برنامه موقع اجرا error میگیرد. نیاز به کسی دارم که کمک کند تا مشکل را پیدا کنم. لطفا از افرادی که به این زبان آگاهی دارند خواهش میکنم پیام بدن. <br />
با تشکر]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[محاسبه عددی بزرگ]]></title>
			<link>https://www.iranled.com/forum/thread-23491.html</link>
			<pubDate>Fri, 20 Apr 2012 07:37:38 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-23491.html</guid>
			<description><![CDATA[با سلام<br />
من می خوام دو عدد بسیار بزرگ رو روشون عملیات ریاضی انجام دهم مثلا در هم ضربشون کنم از اونجایی که هیچ متغیری نمی تونه کل هدد رو ذخیره کته Qbasic ارور overflow <img src="https://www.iranled.com/forum/images/smilies1/exclamation.gif" alt="Exclamation" title="Exclamation" class="smilie smilie_7" />میده راه حلی برای این مشکل میدونید؟]]></description>
			<content:encoded><![CDATA[با سلام<br />
من می خوام دو عدد بسیار بزرگ رو روشون عملیات ریاضی انجام دهم مثلا در هم ضربشون کنم از اونجایی که هیچ متغیری نمی تونه کل هدد رو ذخیره کته Qbasic ارور overflow <img src="https://www.iranled.com/forum/images/smilies1/exclamation.gif" alt="Exclamation" title="Exclamation" class="smilie smilie_7" />میده راه حلی برای این مشکل میدونید؟]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[درخواست PowerBasic Decompiler - دیکامپایلر پاور بیسیک]]></title>
			<link>https://www.iranled.com/forum/thread-20189.html</link>
			<pubDate>Wed, 09 Feb 2011 19:10:55 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-20189.html</guid>
			<description><![CDATA[دوستان کسی PowerBasic Decompiler - دیکامپایلر پاور بیسیک<br />
<br />
سراغ نداره؟<br />
<br />
یک برنامه خارجی دارم که با PowerBasic 7.02 نوشته شده و من می خوام سورس برنامه رو ببینم.<br />
<br />
لطفا کمک کنین.<br />
احتیاج مبرم دارم.]]></description>
			<content:encoded><![CDATA[دوستان کسی PowerBasic Decompiler - دیکامپایلر پاور بیسیک<br />
<br />
سراغ نداره؟<br />
<br />
یک برنامه خارجی دارم که با PowerBasic 7.02 نوشته شده و من می خوام سورس برنامه رو ببینم.<br />
<br />
لطفا کمک کنین.<br />
احتیاج مبرم دارم.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Powerbasic download]]></title>
			<link>https://www.iranled.com/forum/thread-19993.html</link>
			<pubDate>Tue, 18 Jan 2011 11:58:30 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-19993.html</guid>
			<description><![CDATA[<a href="http://hotfile.com/dl/60043409/b5c7bc3/Powerbasic.for.windows.9.05.Retail.rar.html" target="_blank" rel="noopener" class="mycode_url">windows</a><br />
<a href="http://hotfile.com/dl/60044116/7753681/powerbasic.console.5.05.retail.rar.html" target="_blank" rel="noopener" class="mycode_url">console</a>]]></description>
			<content:encoded><![CDATA[<a href="http://hotfile.com/dl/60043409/b5c7bc3/Powerbasic.for.windows.9.05.Retail.rar.html" target="_blank" rel="noopener" class="mycode_url">windows</a><br />
<a href="http://hotfile.com/dl/60044116/7753681/powerbasic.console.5.05.retail.rar.html" target="_blank" rel="noopener" class="mycode_url">console</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[مخقی سازی چند فایل در یک فایل ]]></title>
			<link>https://www.iranled.com/forum/thread-18453.html</link>
			<pubDate>Sat, 28 Aug 2010 09:50:43 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-18453.html</guid>
			<description><![CDATA[سلام دوستان<br />
<br />
شما در نظر بگیرید ما 4 فایل داریم <br />
1.mp3<br />
2.exe<br />
3.jpg<br />
4.dll<br />
<br />
بعد می خواهم اون رو در یک فایل eXE یا bat جا بدم که هر وقت کسی EXE رو باز کرد فایل mp3 و exe براش باز بشه باید چکاری انجام بدم<br />
<br />
تشکر]]></description>
			<content:encoded><![CDATA[سلام دوستان<br />
<br />
شما در نظر بگیرید ما 4 فایل داریم <br />
1.mp3<br />
2.exe<br />
3.jpg<br />
4.dll<br />
<br />
بعد می خواهم اون رو در یک فایل eXE یا bat جا بدم که هر وقت کسی EXE رو باز کرد فایل mp3 و exe براش باز بشه باید چکاری انجام بدم<br />
<br />
تشکر]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[ارتباط  با پورت سریال]]></title>
			<link>https://www.iranled.com/forum/thread-13238.html</link>
			<pubDate>Sun, 28 Jun 2009 14:00:55 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-13238.html</guid>
			<description><![CDATA[با سلام<br />
<br />
من میخوام با vb  یه برنامه بنویسم که یه سری اطلاعات رو با پورت سریال با  میکرو avr   مبادله کنم یعنی هم بفرستم و هم بگیرم<br />
<br />
ازاساتیدی که با vb  کارکردند ممونو میشم راهنمائی بفرمائین<br />
برنامه میکرو رو مشکل ندارم اما مشکلم اینجاس که vb   زیاد کار نکردم<br />
مرسی]]></description>
			<content:encoded><![CDATA[با سلام<br />
<br />
من میخوام با vb  یه برنامه بنویسم که یه سری اطلاعات رو با پورت سریال با  میکرو avr   مبادله کنم یعنی هم بفرستم و هم بگیرم<br />
<br />
ازاساتیدی که با vb  کارکردند ممونو میشم راهنمائی بفرمائین<br />
برنامه میکرو رو مشکل ندارم اما مشکلم اینجاس که vb   زیاد کار نکردم<br />
مرسی]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[چند تابع برای ساخت یک فایل Bitmap]]></title>
			<link>https://www.iranled.com/forum/thread-12201.html</link>
			<pubDate>Sat, 21 Mar 2009 05:05:40 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-12201.html</guid>
			<description><![CDATA[کد زیر حاوی چند تابع برای ساخت فایلهای bitmap ه<br />
<br />
توضیح توابع :<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite>ShiftLeft و ShiftRight عمل شیفت به چپ و راست را در ivar به مقدار icount انجام می دهند<br />
CreateBitmapInfoStruct برای ساخت و تنظیم هدر و ساختمان فایل bitmap به کار می رود<br />
CreateBMPFile آخرین تابع در ساخت این نوع فایلها که تنظیمات را دریافت و فایل bmp را می سازد</blockquote>
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>%MAXWRITE = 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'4 Kbyte<br />
 <br />
TYPE BITMAPINFOQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Modified version of BITMAPINFO<br />
&nbsp;&nbsp;bmiHeader AS BITMAPINFOHEADER<br />
&nbsp;&nbsp;bmiColors AS STRING*(256*4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '256 * SIZEOF(RGBQUAD)<br />
END TYPE<br />
FUNCTION ShiftLeft (BYVAL iVar AS LONG, BYVAL iCount AS LONG) AS LONG<br />
&nbsp;&nbsp;LOCAL iRes AS LONG<br />
 <br />
&nbsp;&nbsp;iRes = iVar<br />
&nbsp;&nbsp;SHIFT LEFT iRes, iCount<br />
&nbsp;&nbsp;FUNCTION = iRes<br />
END FUNCTION<br />
 <br />
<br />
FUNCTION ShiftRight (BYVAL iVar AS LONG, BYVAL iCount AS LONG) AS LONG<br />
&nbsp;&nbsp;LOCAL iRes AS LONG<br />
 <br />
&nbsp;&nbsp;iRes = iVar<br />
&nbsp;&nbsp;SHIFT RIGHT iRes, iCount<br />
&nbsp;&nbsp;FUNCTION = iRes<br />
END FUNCTION<br />
 <br />
' ----------------------------------------------------------------<br />
'FUNCTION CreateBitmapInfoStruct (BYVAL hBmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmiHeader AS BITMAPINFOHEADER) AS LONG<br />
'&nbsp;&nbsp;&nbsp;&nbsp;This function initialises the members of a BITMAPINFOHEADER structure<br />
'&nbsp;&nbsp;&nbsp;&nbsp;for an uncompressed bitmap.&nbsp;&nbsp;Returns %TRUE for success, else %FALSE.<br />
'<br />
FUNCTION CreateBitmapInfoStruct (BYVAL hBmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmiHeader AS BITMAPINFOHEADER) AS LONG<br />
&nbsp;&nbsp;LOCAL bmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS BITMAP,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cClrBits AS WORD<br />
 <br />
&nbsp;&nbsp;FUNCTION = %FALSE<br />
 <br />
&nbsp;&nbsp;'Retrieve the bitmap's color format, width, and height<br />
&nbsp;&nbsp;'-----------------------------------------------------<br />
&nbsp;&nbsp;IF 0 = GetObject(hBmp, SIZEOF(bmp), bmp) THEN EXIT FUNCTION<br />
 <br />
&nbsp;&nbsp;'Convert the color format to a count of bits<br />
&nbsp;&nbsp;'-------------------------------------------<br />
&nbsp;&nbsp;SELECT CASE AS LONG (bmp.bmPlanes * bmp.bmBitsPixel)<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:cClrBits =&nbsp;&nbsp;1<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 4&nbsp;&nbsp; :cClrBits =&nbsp;&nbsp;4<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 8&nbsp;&nbsp; :cClrBits =&nbsp;&nbsp;8<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 16&nbsp;&nbsp;:cClrBits = 16<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 24&nbsp;&nbsp;:cClrBits = 24<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE ELSE&nbsp;&nbsp; :cClrBits = 32<br />
&nbsp;&nbsp;END SELECT<br />
 <br />
&nbsp;&nbsp;'Initialize the fields in the BITMAPINFO structure<br />
&nbsp;&nbsp;'-------------------------------------------------<br />
&nbsp;&nbsp;bmiHeader.biSize&nbsp;&nbsp;&nbsp;&nbsp; = SIZEOF(BITMAPINFOHEADER)<br />
&nbsp;&nbsp;bmiHeader.biWidth&nbsp;&nbsp;&nbsp;&nbsp;= bmp.bmWidth<br />
&nbsp;&nbsp;bmiHeader.biHeight&nbsp;&nbsp; = bmp.bmHeight<br />
&nbsp;&nbsp;bmiHeader.biPlanes&nbsp;&nbsp; = bmp.bmPlanes<br />
&nbsp;&nbsp;bmiHeader.biBitCount = bmp.bmBitsPixel<br />
 <br />
&nbsp;&nbsp;IF cClrBits &lt; 24 THEN bmiHeader.biClrUsed = ShiftLeft(1, cClrBits)<br />
 <br />
&nbsp;&nbsp;'Since bitmap is uncompressed, set the BI_RGB flag<br />
&nbsp;&nbsp;'-------------------------------------------------<br />
&nbsp;&nbsp;bmiHeader.biCompression = %BI_RGB<br />
 <br />
&nbsp;&nbsp;'Compute the number of bytes in the array of color indices *.<br />
&nbsp;&nbsp;'---------------------------------------------------------<br />
&nbsp;&nbsp;bmiHeader.biSizeImage = _<br />
&nbsp;&nbsp;&nbsp;&nbsp;((bmiHeader.biWidth*cClrBits + 31) AND NOT(31)) / 8 _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * bmiHeader.biHeight<br />
 <br />
&nbsp;&nbsp;'Set biClrImportant to 0, indicating that all of the<br />
&nbsp;&nbsp;'device colors are important.<br />
&nbsp;&nbsp;'------------------------------<br />
&nbsp;&nbsp;bmiHeader.biClrImportant = 0<br />
 <br />
&nbsp;&nbsp;FUNCTION = %TRUE<br />
 <br />
END FUNCTION<br />
 <br />
'NOTE: * For Windows NT, the width must be DWORD aligned unless the bitmap<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is RLE compressed. This example shows this.&nbsp;&nbsp;For Windows 95/98/Me,<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the width must be WORD aligned unless the bitmap is RLE compressed.<br />
'<br />
' --------------------------------------------------------------<br />
'FUNCTION CreateBMPFile (sFile AS STRING, hBmp AS DWORD, hDC AS DWORD) AS LONG<br />
'<br />
'&nbsp;&nbsp;&nbsp;&nbsp;Saves a bitmap to a file.&nbsp;&nbsp;Returns %TRUE for success, else %FALSE.<br />
'<br />
FUNCTION CreateBMPFile (sFile AS STRING, hBmp AS DWORD, hDC AS DWORD) AS LONG<br />
<br />
&nbsp;&nbsp;LOCAL iRet&nbsp;&nbsp;&nbsp;&nbsp;AS LONG,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp&nbsp;&nbsp; AS LONG,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'file handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbi&nbsp;&nbsp;&nbsp;&nbsp; AS BITMAPINFOQ,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdr&nbsp;&nbsp;&nbsp;&nbsp; AS BITMAPFILEHEADER,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'bitmap file-header<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbih&nbsp;&nbsp;&nbsp;&nbsp;AS BITMAPINFOHEADER,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'bitmap info-header<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBits&nbsp;&nbsp;AS STRING,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'memory buffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTotal AS DWORD,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'total count of bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'incremental count of bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS BYTE PTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'byte pointer<br />
 <br />
&nbsp;&nbsp;iRet = %FALSE<br />
&nbsp;&nbsp;FUNCTION = iRet<br />
 <br />
&nbsp;&nbsp;'Create BITMAPINFO structure<br />
&nbsp;&nbsp;'---------------------------<br />
&nbsp;&nbsp;IF ISFALSE CreateBitmapInfoStruct (hBmp, pbi.bmiHeader) THEN EXIT FUNCTION<br />
 <br />
&nbsp;&nbsp;'Initialize BITMAPINFOHEADER fields<br />
&nbsp;&nbsp;'----------------------------------<br />
&nbsp;&nbsp;pbih = pbi.bmiHeader<br />
 <br />
&nbsp;&nbsp;'Get bits array and color table (RGBQUAD array)<br />
&nbsp;&nbsp;'----------------------------------------------<br />
&nbsp;&nbsp;lpBits = SPACE&#36;(pbih.biSizeImage)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Buffer for bitmap bits<br />
 <br />
&nbsp;&nbsp;IF 0 = GetDIBits (hDC, hBMP, 0, pbih.biHeight, BYVAL STRPTR(lpBits),_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYVAL VARPTR(pbi), %DIB_RGB_COLORS) THEN EXIT FUNCTION<br />
 <br />
 <br />
&nbsp;&nbsp;'Initialize fields of BITMAPFILEHEADER<br />
&nbsp;&nbsp;'-------------------------------------<br />
&nbsp;&nbsp;hdr.bfType = &amp;H4D42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '"BM",ie. &amp;H42 = "B" &amp;H4D = "M"<br />
 <br />
&nbsp;&nbsp;hdr.bfOffBits = SIZEOF(hdr) + pbih.biSize _&nbsp;&nbsp; 'Offset to bitmap bits<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ pbih.biClrUsed*SIZEOF(RGBQUAD)<br />
 <br />
&nbsp;&nbsp;hdr.bfSize = hdr.bfOffBits + pbih.biSizeImage 'Size of entire file<br />
 <br />
&nbsp;&nbsp;hdr.bfReserved1 = 0<br />
&nbsp;&nbsp;hdr.bfReserved2 = 0<br />
 <br />
&nbsp;&nbsp;'Create the .BMP file<br />
&nbsp;&nbsp;'--------------------<br />
&nbsp;&nbsp;hf = CreateFile (BYVAL STRPTR(sFile), %GENERIC_READ OR _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%GENERIC_WRITE, 0, BYVAL %NULL, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%CREATE_ALWAYS, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%FILE_ATTRIBUTE_NORMAL, %NULL)<br />
&nbsp;&nbsp;IF hf = %INVALID_HANDLE_VALUE THEN EXIT FUNCTION<br />
 <br />
&nbsp;&nbsp;'Copy BITMAPFILEHEADER into .BMP file<br />
&nbsp;&nbsp;'------------------------------------<br />
&nbsp;&nbsp;IF 0 = WriteFile (hf, hdr,&nbsp;&nbsp;SIZEOF(hdr),_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
 <br />
&nbsp;&nbsp;'Copy the BITMAPINFOHEADER into the file<br />
&nbsp;&nbsp;'---------------------------------------<br />
&nbsp;&nbsp;IF 0 = WriteFile (hf, pbih, SIZEOF(pbih),_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
 <br />
&nbsp;&nbsp;'Copy the RGBQUAD array into the file<br />
&nbsp;&nbsp;'------------------------------------<br />
&nbsp;&nbsp;IF pbih.biClrUsed THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;IF 0 = WriteFile (hf, pbi.bmiColors, pbih.biClrUsed*SIZEOF(RGBQUAD), _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
&nbsp;&nbsp;END IF<br />
 <br />
&nbsp;&nbsp;'Copy the bitmap bits into the file<br />
&nbsp;&nbsp;'----------------------------------<br />
&nbsp;&nbsp;dwTotal = pbih.biSizeImage<br />
&nbsp;&nbsp;cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dwTotal<br />
&nbsp;&nbsp;hp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= STRPTR(lpBits)<br />
 <br />
&nbsp;&nbsp;WHILE cb &gt; %MAXWRITE<br />
&nbsp;&nbsp;&nbsp;&nbsp;IF 0 = WriteFile (hf, BYVAL hp, %MAXWRITE,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
&nbsp;&nbsp;&nbsp;&nbsp;cb = cb - %MAXWRITE<br />
&nbsp;&nbsp;&nbsp;&nbsp;hp = hp + %MAXWRITE<br />
&nbsp;&nbsp;WEND<br />
 <br />
&nbsp;&nbsp;IF 0 = WriteFile (hf, BYVAL hp, cb, dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
 <br />
&nbsp;&nbsp;iRet = %TRUE<br />
 <br />
&nbsp;&nbsp;'Close the .BMP file<br />
&nbsp;&nbsp;'-------------------<br />
CloseBMP:<br />
 <br />
&nbsp;&nbsp;CALL CloseHandle (hf)<br />
&nbsp;&nbsp;FUNCTION = iRet<br />
 <br />
END FUNCTION</code></div></div>]]></description>
			<content:encoded><![CDATA[کد زیر حاوی چند تابع برای ساخت فایلهای bitmap ه<br />
<br />
توضیح توابع :<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite>ShiftLeft و ShiftRight عمل شیفت به چپ و راست را در ivar به مقدار icount انجام می دهند<br />
CreateBitmapInfoStruct برای ساخت و تنظیم هدر و ساختمان فایل bitmap به کار می رود<br />
CreateBMPFile آخرین تابع در ساخت این نوع فایلها که تنظیمات را دریافت و فایل bmp را می سازد</blockquote>
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>%MAXWRITE = 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'4 Kbyte<br />
 <br />
TYPE BITMAPINFOQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Modified version of BITMAPINFO<br />
&nbsp;&nbsp;bmiHeader AS BITMAPINFOHEADER<br />
&nbsp;&nbsp;bmiColors AS STRING*(256*4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '256 * SIZEOF(RGBQUAD)<br />
END TYPE<br />
FUNCTION ShiftLeft (BYVAL iVar AS LONG, BYVAL iCount AS LONG) AS LONG<br />
&nbsp;&nbsp;LOCAL iRes AS LONG<br />
 <br />
&nbsp;&nbsp;iRes = iVar<br />
&nbsp;&nbsp;SHIFT LEFT iRes, iCount<br />
&nbsp;&nbsp;FUNCTION = iRes<br />
END FUNCTION<br />
 <br />
<br />
FUNCTION ShiftRight (BYVAL iVar AS LONG, BYVAL iCount AS LONG) AS LONG<br />
&nbsp;&nbsp;LOCAL iRes AS LONG<br />
 <br />
&nbsp;&nbsp;iRes = iVar<br />
&nbsp;&nbsp;SHIFT RIGHT iRes, iCount<br />
&nbsp;&nbsp;FUNCTION = iRes<br />
END FUNCTION<br />
 <br />
' ----------------------------------------------------------------<br />
'FUNCTION CreateBitmapInfoStruct (BYVAL hBmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmiHeader AS BITMAPINFOHEADER) AS LONG<br />
'&nbsp;&nbsp;&nbsp;&nbsp;This function initialises the members of a BITMAPINFOHEADER structure<br />
'&nbsp;&nbsp;&nbsp;&nbsp;for an uncompressed bitmap.&nbsp;&nbsp;Returns %TRUE for success, else %FALSE.<br />
'<br />
FUNCTION CreateBitmapInfoStruct (BYVAL hBmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bmiHeader AS BITMAPINFOHEADER) AS LONG<br />
&nbsp;&nbsp;LOCAL bmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS BITMAP,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cClrBits AS WORD<br />
 <br />
&nbsp;&nbsp;FUNCTION = %FALSE<br />
 <br />
&nbsp;&nbsp;'Retrieve the bitmap's color format, width, and height<br />
&nbsp;&nbsp;'-----------------------------------------------------<br />
&nbsp;&nbsp;IF 0 = GetObject(hBmp, SIZEOF(bmp), bmp) THEN EXIT FUNCTION<br />
 <br />
&nbsp;&nbsp;'Convert the color format to a count of bits<br />
&nbsp;&nbsp;'-------------------------------------------<br />
&nbsp;&nbsp;SELECT CASE AS LONG (bmp.bmPlanes * bmp.bmBitsPixel)<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:cClrBits =&nbsp;&nbsp;1<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 4&nbsp;&nbsp; :cClrBits =&nbsp;&nbsp;4<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 8&nbsp;&nbsp; :cClrBits =&nbsp;&nbsp;8<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 16&nbsp;&nbsp;:cClrBits = 16<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE &lt;= 24&nbsp;&nbsp;:cClrBits = 24<br />
&nbsp;&nbsp;&nbsp;&nbsp;CASE ELSE&nbsp;&nbsp; :cClrBits = 32<br />
&nbsp;&nbsp;END SELECT<br />
 <br />
&nbsp;&nbsp;'Initialize the fields in the BITMAPINFO structure<br />
&nbsp;&nbsp;'-------------------------------------------------<br />
&nbsp;&nbsp;bmiHeader.biSize&nbsp;&nbsp;&nbsp;&nbsp; = SIZEOF(BITMAPINFOHEADER)<br />
&nbsp;&nbsp;bmiHeader.biWidth&nbsp;&nbsp;&nbsp;&nbsp;= bmp.bmWidth<br />
&nbsp;&nbsp;bmiHeader.biHeight&nbsp;&nbsp; = bmp.bmHeight<br />
&nbsp;&nbsp;bmiHeader.biPlanes&nbsp;&nbsp; = bmp.bmPlanes<br />
&nbsp;&nbsp;bmiHeader.biBitCount = bmp.bmBitsPixel<br />
 <br />
&nbsp;&nbsp;IF cClrBits &lt; 24 THEN bmiHeader.biClrUsed = ShiftLeft(1, cClrBits)<br />
 <br />
&nbsp;&nbsp;'Since bitmap is uncompressed, set the BI_RGB flag<br />
&nbsp;&nbsp;'-------------------------------------------------<br />
&nbsp;&nbsp;bmiHeader.biCompression = %BI_RGB<br />
 <br />
&nbsp;&nbsp;'Compute the number of bytes in the array of color indices *.<br />
&nbsp;&nbsp;'---------------------------------------------------------<br />
&nbsp;&nbsp;bmiHeader.biSizeImage = _<br />
&nbsp;&nbsp;&nbsp;&nbsp;((bmiHeader.biWidth*cClrBits + 31) AND NOT(31)) / 8 _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * bmiHeader.biHeight<br />
 <br />
&nbsp;&nbsp;'Set biClrImportant to 0, indicating that all of the<br />
&nbsp;&nbsp;'device colors are important.<br />
&nbsp;&nbsp;'------------------------------<br />
&nbsp;&nbsp;bmiHeader.biClrImportant = 0<br />
 <br />
&nbsp;&nbsp;FUNCTION = %TRUE<br />
 <br />
END FUNCTION<br />
 <br />
'NOTE: * For Windows NT, the width must be DWORD aligned unless the bitmap<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is RLE compressed. This example shows this.&nbsp;&nbsp;For Windows 95/98/Me,<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the width must be WORD aligned unless the bitmap is RLE compressed.<br />
'<br />
' --------------------------------------------------------------<br />
'FUNCTION CreateBMPFile (sFile AS STRING, hBmp AS DWORD, hDC AS DWORD) AS LONG<br />
'<br />
'&nbsp;&nbsp;&nbsp;&nbsp;Saves a bitmap to a file.&nbsp;&nbsp;Returns %TRUE for success, else %FALSE.<br />
'<br />
FUNCTION CreateBMPFile (sFile AS STRING, hBmp AS DWORD, hDC AS DWORD) AS LONG<br />
<br />
&nbsp;&nbsp;LOCAL iRet&nbsp;&nbsp;&nbsp;&nbsp;AS LONG,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp&nbsp;&nbsp; AS LONG,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'file handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbi&nbsp;&nbsp;&nbsp;&nbsp; AS BITMAPINFOQ,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdr&nbsp;&nbsp;&nbsp;&nbsp; AS BITMAPFILEHEADER,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'bitmap file-header<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbih&nbsp;&nbsp;&nbsp;&nbsp;AS BITMAPINFOHEADER,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'bitmap info-header<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBits&nbsp;&nbsp;AS STRING,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'memory buffer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTotal AS DWORD,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'total count of bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS DWORD,_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'incremental count of bytes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AS BYTE PTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'byte pointer<br />
 <br />
&nbsp;&nbsp;iRet = %FALSE<br />
&nbsp;&nbsp;FUNCTION = iRet<br />
 <br />
&nbsp;&nbsp;'Create BITMAPINFO structure<br />
&nbsp;&nbsp;'---------------------------<br />
&nbsp;&nbsp;IF ISFALSE CreateBitmapInfoStruct (hBmp, pbi.bmiHeader) THEN EXIT FUNCTION<br />
 <br />
&nbsp;&nbsp;'Initialize BITMAPINFOHEADER fields<br />
&nbsp;&nbsp;'----------------------------------<br />
&nbsp;&nbsp;pbih = pbi.bmiHeader<br />
 <br />
&nbsp;&nbsp;'Get bits array and color table (RGBQUAD array)<br />
&nbsp;&nbsp;'----------------------------------------------<br />
&nbsp;&nbsp;lpBits = SPACE&#36;(pbih.biSizeImage)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Buffer for bitmap bits<br />
 <br />
&nbsp;&nbsp;IF 0 = GetDIBits (hDC, hBMP, 0, pbih.biHeight, BYVAL STRPTR(lpBits),_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYVAL VARPTR(pbi), %DIB_RGB_COLORS) THEN EXIT FUNCTION<br />
 <br />
 <br />
&nbsp;&nbsp;'Initialize fields of BITMAPFILEHEADER<br />
&nbsp;&nbsp;'-------------------------------------<br />
&nbsp;&nbsp;hdr.bfType = &amp;H4D42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '"BM",ie. &amp;H42 = "B" &amp;H4D = "M"<br />
 <br />
&nbsp;&nbsp;hdr.bfOffBits = SIZEOF(hdr) + pbih.biSize _&nbsp;&nbsp; 'Offset to bitmap bits<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ pbih.biClrUsed*SIZEOF(RGBQUAD)<br />
 <br />
&nbsp;&nbsp;hdr.bfSize = hdr.bfOffBits + pbih.biSizeImage 'Size of entire file<br />
 <br />
&nbsp;&nbsp;hdr.bfReserved1 = 0<br />
&nbsp;&nbsp;hdr.bfReserved2 = 0<br />
 <br />
&nbsp;&nbsp;'Create the .BMP file<br />
&nbsp;&nbsp;'--------------------<br />
&nbsp;&nbsp;hf = CreateFile (BYVAL STRPTR(sFile), %GENERIC_READ OR _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%GENERIC_WRITE, 0, BYVAL %NULL, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%CREATE_ALWAYS, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%FILE_ATTRIBUTE_NORMAL, %NULL)<br />
&nbsp;&nbsp;IF hf = %INVALID_HANDLE_VALUE THEN EXIT FUNCTION<br />
 <br />
&nbsp;&nbsp;'Copy BITMAPFILEHEADER into .BMP file<br />
&nbsp;&nbsp;'------------------------------------<br />
&nbsp;&nbsp;IF 0 = WriteFile (hf, hdr,&nbsp;&nbsp;SIZEOF(hdr),_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
 <br />
&nbsp;&nbsp;'Copy the BITMAPINFOHEADER into the file<br />
&nbsp;&nbsp;'---------------------------------------<br />
&nbsp;&nbsp;IF 0 = WriteFile (hf, pbih, SIZEOF(pbih),_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
 <br />
&nbsp;&nbsp;'Copy the RGBQUAD array into the file<br />
&nbsp;&nbsp;'------------------------------------<br />
&nbsp;&nbsp;IF pbih.biClrUsed THEN<br />
&nbsp;&nbsp;&nbsp;&nbsp;IF 0 = WriteFile (hf, pbi.bmiColors, pbih.biClrUsed*SIZEOF(RGBQUAD), _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
&nbsp;&nbsp;END IF<br />
 <br />
&nbsp;&nbsp;'Copy the bitmap bits into the file<br />
&nbsp;&nbsp;'----------------------------------<br />
&nbsp;&nbsp;dwTotal = pbih.biSizeImage<br />
&nbsp;&nbsp;cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= dwTotal<br />
&nbsp;&nbsp;hp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= STRPTR(lpBits)<br />
 <br />
&nbsp;&nbsp;WHILE cb &gt; %MAXWRITE<br />
&nbsp;&nbsp;&nbsp;&nbsp;IF 0 = WriteFile (hf, BYVAL hp, %MAXWRITE,_<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
&nbsp;&nbsp;&nbsp;&nbsp;cb = cb - %MAXWRITE<br />
&nbsp;&nbsp;&nbsp;&nbsp;hp = hp + %MAXWRITE<br />
&nbsp;&nbsp;WEND<br />
 <br />
&nbsp;&nbsp;IF 0 = WriteFile (hf, BYVAL hp, cb, dwTmp, BYVAL %NULL) THEN GOTO CloseBMP<br />
 <br />
&nbsp;&nbsp;iRet = %TRUE<br />
 <br />
&nbsp;&nbsp;'Close the .BMP file<br />
&nbsp;&nbsp;'-------------------<br />
CloseBMP:<br />
 <br />
&nbsp;&nbsp;CALL CloseHandle (hf)<br />
&nbsp;&nbsp;FUNCTION = iRet<br />
 <br />
END FUNCTION</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[خواندن اطلاعات یک PDF]]></title>
			<link>https://www.iranled.com/forum/thread-11994.html</link>
			<pubDate>Mon, 09 Mar 2009 14:28:03 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11994.html</guid>
			<description><![CDATA[این کد برای کنسول نوشته شده و می تونید هرجا خروجی هست یک MsgBox بذارید اما من دست<br />
<br />
به سورس نزدم و همون اصلش رو گذاشتم چون زیاد سورس از کنسول نذاشته بودم<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe<br />
#Dim All<br />
<br />
#Include "Win32API.inc"<br />
<br />
Type TPdfObj<br />
&nbsp;&nbsp;&nbsp;&nbsp;number As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;offset As Long<br />
End Type<br />
<br />
Type TPdfInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;creator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;producer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;keywords&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 512<br />
&nbsp;&nbsp;&nbsp;&nbsp;subject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * %MAX_PATH<br />
&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * %MAX_PATH<br />
&nbsp;&nbsp;&nbsp;&nbsp;creationDate&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 32<br />
&nbsp;&nbsp;&nbsp;&nbsp;modDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * 32<br />
&nbsp;&nbsp;&nbsp;&nbsp;pageCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;fileSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Quad<br />
&nbsp;&nbsp;&nbsp;&nbsp;version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * 6<br />
&nbsp;&nbsp;&nbsp;&nbsp;linearized&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Byte<br />
&nbsp;&nbsp;&nbsp;&nbsp;tagged&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Byte<br />
&nbsp;&nbsp;&nbsp;&nbsp;encrypted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Byte<br />
End Type<br />
<br />
%BUF_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1024<br />
<br />
%ERR_PASSED_BOF = 151<br />
%ERR_NAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 152<br />
%ERR_NO_TRAILER = 153<br />
%ERR_NOT_FOUND&nbsp;&nbsp;= 154<br />
<br />
Sub STDOUT(sOut As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hConsole As Dword<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local bWritten As Dword<br />
&nbsp;&nbsp;&nbsp;&nbsp;If hConsole = 0 Then AllocConsole: hConsole = GetStdHandle(%STD_OUTPUT_HANDLE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;WriteFile hConsole,ByVal StrPtr(sOut),Len(sOut),bWritten,ByVal %NULL<br />
End Sub<br />
<br />
Sub Usage()<br />
&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Usage:" &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "pdfinfo path" &amp; &#36;CrLf<br />
End Sub<br />
<br />
'-- Avoid need for global variable hFile<br />
Function GetOrSetHandle(h As Long) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hFile As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If hFile = 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hFile = h<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = hFile<br />
<br />
End Function<br />
<br />
Function GetData(offset As Quad, ln As Long) As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmp As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hFile As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;hFile = GetOrSetHandle(0)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Seek #hFile, offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;Get&#36; #hFile, ln, tmp<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = tmp<br />
<br />
End Function<br />
<br />
Function GetNumber(p As Quad, num As Long) As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmpStr As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ch As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do While GetData(p, 1) &lt; "!"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do While (ch &gt;= "0" And ch &lt;= "9")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpStr = tmpStr &amp; ch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;If tmpStr = "" Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;num = Val(tmpStr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %TRUE<br />
<br />
End Function<br />
<br />
Function GetString(p As Quad, str As Asciiz) As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmp As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lp As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ms As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;ms = "/" &amp; &#36;CrLf<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do While GetData(p, 1) &lt; "!"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = GetData(p, %BUF_SIZE)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Find terminator<br />
&nbsp;&nbsp;&nbsp;&nbsp;lp = InStr(tmp, Any ms)<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = Left&#36;(tmp, lp-1)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Is it Unicode encoded?<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Asc(Mid&#36;(tmp,2,1)) = 254 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- If yes, convert to ascii<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = ACode&#36;(Mid&#36;(tmp, 3))<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Trim enclosing ()<br />
&nbsp;&nbsp;&nbsp;&nbsp;lp = InStr(-1, tmp, ")")<br />
&nbsp;&nbsp;&nbsp;&nbsp;If lp &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = Left&#36;(tmp, lp-1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Left&#36;(tmp, 1) = "(" Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = Mid&#36;(tmp, 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Remove escape char<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = Remove&#36;(tmp, "&#92;")<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Len(tmp) &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str = Trim&#36;(tmp)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str = ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
End Function<br />
<br />
Function IsString(p As Quad, str As String) As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ln As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ln = Len(str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If GetData(p, ln) = str Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;p = p + ln<br />
<br />
End Function<br />
<br />
Function FindStrInDict(p As Quad, str As String) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmp As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lp As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = GetData(p, %BUF_SIZE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;lp = InStr(tmp, str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If lp &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p + lp -1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = IsString(p, str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
End Function<br />
<br />
Function GetPdfInfo(filename As String, PdfInfo As TPdfInfo) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim PdfObjList(0 To 0) As TPdfObj<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local k As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local cnt As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local pagesNum As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local rootNum As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local infoNum As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ch As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local p As Quad<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local p2 As Quad<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hFile As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = 0<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hFile = FreeFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call GetOrSetHandle(hFile)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Open filename For Binary Access Read As #hFile Base=0<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Get file size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.fileSize = Lof(hFile)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Get the PDF version<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = 5<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call GetString(p, PdfInfo.version)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find 'startxref' ignoring '%%EOF'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = Lof(hFile) - 5<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While (p &gt; p2) And (ch &lt;&gt; "f")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Decr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (p &lt;= p2) Then Error %ERR_PASSED_BOF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If LCase&#36;(GetData(p-8, 9)) = "startxref" Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Decr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rootNum = -1 '-- Flags not yet found<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infoNum = -1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- xref offset ==&gt; k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = k + 4<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- get base object number ==&gt; k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- get object count ==&gt; cnt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, cnt) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While IsFalse(ch &gt;= "0" And ch &lt;= "9")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- add all objects in section to list ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For cnt = 0 To cnt-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve PdfObjList(UBound(PdfObjList) + 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfObjList(UBound(PdfObjList)).number = k + cnt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, PdfObjList(UBound(PdfObjList)).offset) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p2 + 20<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next cnt<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsTrue(ch &gt;= "0" And ch &lt;= "9") Then Iterate Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse IsString(p, "trailer") Then Error %ERR_NO_TRAILER<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find the /Encrypt object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsTrue FindStrInDict(p, "/Encrypt") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.encrypted = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find the /Info object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (infoNum = -1) And IsTrue FindStrInDict(p, "/Info") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, infoNum) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find the /Root object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (rootNum = -1) And IsTrue FindStrInDict(p, "/Root") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, rootNum) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (rootNum &lt;&gt; -1) And (infoNum &lt;&gt; -1) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse FindStrInDict(p, "/Prev") Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = k + 4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If rootNum &lt; 0 Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find "Linearized" (Optimized) and "StructTreeRoot" (Tagged) keys<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Linearized 1") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.linearized = %TRUE<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif FindStrInDict(p, "/StructTreeRoot") then<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.tagged = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If infoNum &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = infoNum Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k = UBound(PdfObjList) Then Error %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Or (k &lt;&gt; infoNum) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/CreationDate") Then GetString p, PdfInfo.creationDate<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/ModDate") Then GetString p, pdfInfo.modDate<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Producer") Then GetString p, PdfInfo.producer<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Author") Then GetString p, PdfInfo.author<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Creator") Then GetString p, pdfInfo.creator<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Title") Then GetString p, pdfInfo.title<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Subject") Then GetString p, pdfInfo.subject<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Keywords") Then GetString p, pdfInfo.keywords<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Ignore info errors<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = rootNum Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k = UBound(PdfObjList) Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Or (k &lt;&gt; rootNum) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse FindStrInDict(p, "/Pages") Then Error %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, pagesNum) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = pagesNum Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k = UBound(pdfObjList) Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Or (k &lt;&gt; pagesNum) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse FindStrInDict(p, "/Count") Then Error %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, cnt) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsTrue GetNumber(p, k) And IsString(p, " R") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt;= UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = cnt Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k &gt; UBound(PdfObjList) Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;&nbsp;IsFalse GetNumber(p, k) Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFalse GetNumber(p, k) Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFalse IsString(p, " obj") Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFalse GetNumber(p, cnt) Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Catch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case Err<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: PDF file is damaged." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_PASSED_BOF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: PDF file is damaged." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_NO_TRAILER<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: Couldn't find trailer dictionary." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: Object not found." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = Err<br />
&nbsp;&nbsp;&nbsp;&nbsp;Finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close #hFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;End Try<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.pageCount = cnt<br />
<br />
End Function<br />
<br />
Function PBMain() As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ret As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local Path As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local PdfInfo As TPdfInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local msg As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Path = Remove&#36;(Command&#36;, &#36;Dq)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Path = "" Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usage<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ret = GetPdfInfo(Path, PdfInfo)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If ret = 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg = _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; PdfInfo.title &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Subject:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; PdfInfo.subject &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Keywords:&nbsp;&nbsp;&nbsp;&nbsp; " &amp; PdfInfo.keywords &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " &amp; PdfInfo.author &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Creator:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; PdfInfo.creator &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Producer:&nbsp;&nbsp;&nbsp;&nbsp; " &amp; pdfInfo.producer &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"CreationDate: " &amp; pdfInfo.creationDate &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ModDate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; pdfInfo.modDate &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ ' "Tagged:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " &amp; iif&#36;(PdfInfo.tagged, "yes", "no") &amp; &#36;CRLF &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Pages:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; Trim&#36;(Str&#36;(PdfInfo.pageCount)) &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Encrypted:&nbsp;&nbsp;&nbsp;&nbsp;" &amp; IIf&#36;(PdfInfo.encrypted, "yes", "no") &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"File size:&nbsp;&nbsp;&nbsp;&nbsp;" &amp; Trim&#36;(Str&#36;(PdfInfo.fileSize)) &amp; " bytes" &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Optimized:&nbsp;&nbsp;&nbsp;&nbsp;" &amp; IIf&#36;(PdfInfo.linearized, "yes", "no") &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"PDF version:&nbsp;&nbsp;" &amp; PdfInfo.version &amp; &#36;CrLf<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT msg<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Sleep 2000<br />
<br />
End Function</code></div></div>]]></description>
			<content:encoded><![CDATA[این کد برای کنسول نوشته شده و می تونید هرجا خروجی هست یک MsgBox بذارید اما من دست<br />
<br />
به سورس نزدم و همون اصلش رو گذاشتم چون زیاد سورس از کنسول نذاشته بودم<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe<br />
#Dim All<br />
<br />
#Include "Win32API.inc"<br />
<br />
Type TPdfObj<br />
&nbsp;&nbsp;&nbsp;&nbsp;number As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;offset As Long<br />
End Type<br />
<br />
Type TPdfInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;creator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;producer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 80<br />
&nbsp;&nbsp;&nbsp;&nbsp;keywords&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 512<br />
&nbsp;&nbsp;&nbsp;&nbsp;subject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * %MAX_PATH<br />
&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * %MAX_PATH<br />
&nbsp;&nbsp;&nbsp;&nbsp;creationDate&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * 32<br />
&nbsp;&nbsp;&nbsp;&nbsp;modDate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * 32<br />
&nbsp;&nbsp;&nbsp;&nbsp;pageCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;fileSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Quad<br />
&nbsp;&nbsp;&nbsp;&nbsp;version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * 6<br />
&nbsp;&nbsp;&nbsp;&nbsp;linearized&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Byte<br />
&nbsp;&nbsp;&nbsp;&nbsp;tagged&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Byte<br />
&nbsp;&nbsp;&nbsp;&nbsp;encrypted&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Byte<br />
End Type<br />
<br />
%BUF_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1024<br />
<br />
%ERR_PASSED_BOF = 151<br />
%ERR_NAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 152<br />
%ERR_NO_TRAILER = 153<br />
%ERR_NOT_FOUND&nbsp;&nbsp;= 154<br />
<br />
Sub STDOUT(sOut As String)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hConsole As Dword<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local bWritten As Dword<br />
&nbsp;&nbsp;&nbsp;&nbsp;If hConsole = 0 Then AllocConsole: hConsole = GetStdHandle(%STD_OUTPUT_HANDLE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;WriteFile hConsole,ByVal StrPtr(sOut),Len(sOut),bWritten,ByVal %NULL<br />
End Sub<br />
<br />
Sub Usage()<br />
&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Usage:" &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "pdfinfo path" &amp; &#36;CrLf<br />
End Sub<br />
<br />
'-- Avoid need for global variable hFile<br />
Function GetOrSetHandle(h As Long) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hFile As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If hFile = 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hFile = h<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = hFile<br />
<br />
End Function<br />
<br />
Function GetData(offset As Quad, ln As Long) As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmp As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hFile As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;hFile = GetOrSetHandle(0)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Seek #hFile, offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;Get&#36; #hFile, ln, tmp<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = tmp<br />
<br />
End Function<br />
<br />
Function GetNumber(p As Quad, num As Long) As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmpStr As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ch As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do While GetData(p, 1) &lt; "!"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do While (ch &gt;= "0" And ch &lt;= "9")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpStr = tmpStr &amp; ch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;If tmpStr = "" Then Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;num = Val(tmpStr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %TRUE<br />
<br />
End Function<br />
<br />
Function GetString(p As Quad, str As Asciiz) As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmp As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lp As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ms As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;ms = "/" &amp; &#36;CrLf<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do While GetData(p, 1) &lt; "!"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = GetData(p, %BUF_SIZE)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Find terminator<br />
&nbsp;&nbsp;&nbsp;&nbsp;lp = InStr(tmp, Any ms)<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = Left&#36;(tmp, lp-1)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Is it Unicode encoded?<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Asc(Mid&#36;(tmp,2,1)) = 254 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- If yes, convert to ascii<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = ACode&#36;(Mid&#36;(tmp, 3))<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Trim enclosing ()<br />
&nbsp;&nbsp;&nbsp;&nbsp;lp = InStr(-1, tmp, ")")<br />
&nbsp;&nbsp;&nbsp;&nbsp;If lp &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = Left&#36;(tmp, lp-1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Left&#36;(tmp, 1) = "(" Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp = Mid&#36;(tmp, 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;'-- Remove escape char<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = Remove&#36;(tmp, "&#92;")<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Len(tmp) &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str = Trim&#36;(tmp)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str = ""<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
End Function<br />
<br />
Function IsString(p As Quad, str As String) As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ln As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ln = Len(str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If GetData(p, ln) = str Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;p = p + ln<br />
<br />
End Function<br />
<br />
Function FindStrInDict(p As Quad, str As String) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tmp As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lp As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = %FALSE<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp = GetData(p, %BUF_SIZE)<br />
&nbsp;&nbsp;&nbsp;&nbsp;lp = InStr(tmp, str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If lp &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p + lp -1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = IsString(p, str)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
End Function<br />
<br />
Function GetPdfInfo(filename As String, PdfInfo As TPdfInfo) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim PdfObjList(0 To 0) As TPdfObj<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local k As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local cnt As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local pagesNum As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local rootNum As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local infoNum As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ch As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local p As Quad<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local p2 As Quad<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hFile As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = 0<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hFile = FreeFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call GetOrSetHandle(hFile)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Open filename For Binary Access Read As #hFile Base=0<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Get file size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.fileSize = Lof(hFile)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Get the PDF version<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = 5<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call GetString(p, PdfInfo.version)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find 'startxref' ignoring '%%EOF'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = Lof(hFile) - 5<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While (p &gt; p2) And (ch &lt;&gt; "f")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Decr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (p &lt;= p2) Then Error %ERR_PASSED_BOF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If LCase&#36;(GetData(p-8, 9)) = "startxref" Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Decr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rootNum = -1 '-- Flags not yet found<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;infoNum = -1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- xref offset ==&gt; k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = k + 4<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- get base object number ==&gt; k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- get object count ==&gt; cnt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, cnt) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While IsFalse(ch &gt;= "0" And ch &lt;= "9")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- add all objects in section to list ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For cnt = 0 To cnt-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve PdfObjList(UBound(PdfObjList) + 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfObjList(UBound(PdfObjList)).number = k + cnt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, PdfObjList(UBound(PdfObjList)).offset) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p2 + 20<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next cnt<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = GetData(p, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsTrue(ch &gt;= "0" And ch &lt;= "9") Then Iterate Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse IsString(p, "trailer") Then Error %ERR_NO_TRAILER<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find the /Encrypt object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsTrue FindStrInDict(p, "/Encrypt") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.encrypted = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find the /Info object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (infoNum = -1) And IsTrue FindStrInDict(p, "/Info") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, infoNum) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find the /Root object<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (rootNum = -1) And IsTrue FindStrInDict(p, "/Root") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, rootNum) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If (rootNum &lt;&gt; -1) And (infoNum &lt;&gt; -1) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse FindStrInDict(p, "/Prev") Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = k + 4<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If rootNum &lt; 0 Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Find "Linearized" (Optimized) and "StructTreeRoot" (Tagged) keys<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Linearized 1") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.linearized = %TRUE<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif FindStrInDict(p, "/StructTreeRoot") then<br />
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.tagged = %TRUE<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If infoNum &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = infoNum Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k = UBound(PdfObjList) Then Error %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Or (k &lt;&gt; infoNum) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2 = p<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/CreationDate") Then GetString p, PdfInfo.creationDate<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/ModDate") Then GetString p, pdfInfo.modDate<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Producer") Then GetString p, PdfInfo.producer<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Author") Then GetString p, PdfInfo.author<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Creator") Then GetString p, pdfInfo.creator<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Title") Then GetString p, pdfInfo.title<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Subject") Then GetString p, pdfInfo.subject<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = p2<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If FindStrInDict(p, "/Keywords") Then GetString p, pdfInfo.keywords<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'-- Ignore info errors<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = rootNum Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k = UBound(PdfObjList) Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Or (k &lt;&gt; rootNum) Then Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse FindStrInDict(p, "/Pages") Then Error %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, pagesNum) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt; UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = pagesNum Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k = UBound(pdfObjList) Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, k) Or (k &lt;&gt; pagesNum) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse FindStrInDict(p, "/Count") Then Error %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsFalse GetNumber(p, cnt) Then Error %ERR_NAN<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If IsTrue GetNumber(p, k) And IsString(p, " R") Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do While k &lt;= UBound(PdfObjList)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If PdfObjList(k).number = cnt Then Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If k &gt; UBound(PdfObjList) Then Error %ERR_NOT_FOUND<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = PdfObjList(k).offset<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;&nbsp;IsFalse GetNumber(p, k) Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFalse GetNumber(p, k) Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFalse IsString(p, " obj") Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsFalse GetNumber(p, cnt) Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Catch<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case Err<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_NAN<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: PDF file is damaged." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_PASSED_BOF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: PDF file is damaged." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_NO_TRAILER<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: Couldn't find trailer dictionary." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %ERR_NOT_FOUND<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT "Error: Object not found." &amp; &#36;CrLf<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = Err<br />
&nbsp;&nbsp;&nbsp;&nbsp;Finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close #hFile<br />
&nbsp;&nbsp;&nbsp;&nbsp;End Try<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;PdfInfo.pageCount = cnt<br />
<br />
End Function<br />
<br />
Function PBMain() As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ret As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local Path As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local PdfInfo As TPdfInfo<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local msg As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Path = Remove&#36;(Command&#36;, &#36;Dq)<br />
&nbsp;&nbsp;&nbsp;&nbsp;If Path = "" Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usage<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ret = GetPdfInfo(Path, PdfInfo)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If ret = 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg = _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Title:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; PdfInfo.title &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Subject:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; PdfInfo.subject &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Keywords:&nbsp;&nbsp;&nbsp;&nbsp; " &amp; PdfInfo.keywords &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " &amp; PdfInfo.author &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Creator:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; PdfInfo.creator &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Producer:&nbsp;&nbsp;&nbsp;&nbsp; " &amp; pdfInfo.producer &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"CreationDate: " &amp; pdfInfo.creationDate &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"ModDate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; pdfInfo.modDate &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_ ' "Tagged:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " &amp; iif&#36;(PdfInfo.tagged, "yes", "no") &amp; &#36;CRLF &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Pages:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" &amp; Trim&#36;(Str&#36;(PdfInfo.pageCount)) &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Encrypted:&nbsp;&nbsp;&nbsp;&nbsp;" &amp; IIf&#36;(PdfInfo.encrypted, "yes", "no") &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"File size:&nbsp;&nbsp;&nbsp;&nbsp;" &amp; Trim&#36;(Str&#36;(PdfInfo.fileSize)) &amp; " bytes" &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Optimized:&nbsp;&nbsp;&nbsp;&nbsp;" &amp; IIf&#36;(PdfInfo.linearized, "yes", "no") &amp; &#36;CrLf &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"PDF version:&nbsp;&nbsp;" &amp; PdfInfo.version &amp; &#36;CrLf<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STDOUT msg<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Sleep 2000<br />
<br />
End Function</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[C Run-Time Library برای پاوربیسیک]]></title>
			<link>https://www.iranled.com/forum/thread-11813.html</link>
			<pubDate>Tue, 24 Feb 2009 09:38:04 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11813.html</guid>
			<description><![CDATA[اینجا هدر مورد استفاده توسط کامپایلر C و ++C به هدرهای پاوربیسیک تبدیل می شود<br />
<br />
که این سرفایلها(هدرها) را در پوشه WinAPI کامپایلر پاوربیسیک کپی کنید<br />
<br />
و با فراخوانی آنها توسط دستور Include می توانید از توابع آنها استفاده کنید برای مثال <br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Include "Time.inc"</code></div></div><br />
هدر های موجود در این بسته :<br />
<span style="color: #800000;" class="mycode_color"><br />
1-هدر Time.h که به Time.inc تبدیل شده است<br />
<br />
2-هدر Float.h که به Float.Inc تبدیل شده است<br />
<br />
3-هدر Ctype.h که به Ctype.inc تبدیل شده است <br />
<br />
4-هدر math.h که به Math.Inc تبدیل شده است <br />
<br />
5-هدر Stdio.h که به Stdio.Inc تبدیل شده است <br />
<br />
6-هدر fcntl.h که به Fcntl.Inc تبدیل شده است <br />
<br />
7-هدر Io.h که به IO.Inc تبدیل شده است <br />
<br />
8-هدر direct.h که به Direct.Inc تبدیل شده است <br />
<br />
9-هدر conio.h که به Conio.Inc تبدیل شده است <br />
<br />
10-هدر mbctype.h که به Mbctype.Inc تبدیل شده است <br />
<br />
11-هدر memory.h که به Memory.Inc تبدیل شده است <br />
<br />
12-هدر string.h که به String.inc تبدیل شده است <br />
<br />
13-هدر search.h که به Search.Inc تبدیل شده است <br />
<br />
14-هدر malloc.h که به Malloc.Inc تبدیل شده است <br />
<br />
15-هدر locking.h که به Locking.Inc تبدیل شده است <br />
<br />
16-هدر stat.h که به Stat.Inc تبدیل شده است <br />
<br />
17-هدر mbstring.h که به Mbstring.Inc تبدیل شده است <br />
</span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2264" target="_blank">C RunTime Lib For PB.zip</a> (اندازه:  29.13 KB / تعداد دفعات دریافت:  128)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[اینجا هدر مورد استفاده توسط کامپایلر C و ++C به هدرهای پاوربیسیک تبدیل می شود<br />
<br />
که این سرفایلها(هدرها) را در پوشه WinAPI کامپایلر پاوربیسیک کپی کنید<br />
<br />
و با فراخوانی آنها توسط دستور Include می توانید از توابع آنها استفاده کنید برای مثال <br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Include "Time.inc"</code></div></div><br />
هدر های موجود در این بسته :<br />
<span style="color: #800000;" class="mycode_color"><br />
1-هدر Time.h که به Time.inc تبدیل شده است<br />
<br />
2-هدر Float.h که به Float.Inc تبدیل شده است<br />
<br />
3-هدر Ctype.h که به Ctype.inc تبدیل شده است <br />
<br />
4-هدر math.h که به Math.Inc تبدیل شده است <br />
<br />
5-هدر Stdio.h که به Stdio.Inc تبدیل شده است <br />
<br />
6-هدر fcntl.h که به Fcntl.Inc تبدیل شده است <br />
<br />
7-هدر Io.h که به IO.Inc تبدیل شده است <br />
<br />
8-هدر direct.h که به Direct.Inc تبدیل شده است <br />
<br />
9-هدر conio.h که به Conio.Inc تبدیل شده است <br />
<br />
10-هدر mbctype.h که به Mbctype.Inc تبدیل شده است <br />
<br />
11-هدر memory.h که به Memory.Inc تبدیل شده است <br />
<br />
12-هدر string.h که به String.inc تبدیل شده است <br />
<br />
13-هدر search.h که به Search.Inc تبدیل شده است <br />
<br />
14-هدر malloc.h که به Malloc.Inc تبدیل شده است <br />
<br />
15-هدر locking.h که به Locking.Inc تبدیل شده است <br />
<br />
16-هدر stat.h که به Stat.Inc تبدیل شده است <br />
<br />
17-هدر mbstring.h که به Mbstring.Inc تبدیل شده است <br />
</span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2264" target="_blank">C RunTime Lib For PB.zip</a> (اندازه:  29.13 KB / تعداد دفعات دریافت:  128)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[دیس اسمبلر فایلهای midi]]></title>
			<link>https://www.iranled.com/forum/thread-11803.html</link>
			<pubDate>Mon, 23 Feb 2009 14:20:04 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11803.html</guid>
			<description><![CDATA[برنامه رو کامپایل و باز کنید،سپس فایل MIDI رو گرفته و به دورن برنامه بیندازید و اطلاعات را ذخیره کنید<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe "MidiDisAsm.exe"<br />
#Dim All<br />
#Register All<br />
'**************************************<br />
'from IncLean file<br />
%WINAPI = 1<br />
%TRUE = 1<br />
%FALSE = 0<br />
%MAX_PATH = 260 ' max. length of full pathname<br />
%wm_destroy = &amp;H2<br />
%wm_initdialog = &amp;H110<br />
%wm_command = &amp;H111<br />
%WM_DROPFILES = &amp;H233<br />
%ws_popup = &amp;H80000000<br />
%ws_child = &amp;H40000000<br />
%ws_visible = &amp;H10000000<br />
%ws_clipsiblings = &amp;H04000000<br />
%ws_caption = &amp;H00C00000 ' WS_BORDER OR WS_DLGFRAME<br />
%ws_border = &amp;H00800000<br />
%ws_dlgframe = &amp;H00400000<br />
%ws_sysmenu = &amp;H00080000<br />
%ws_tabstop = &amp;H00010000<br />
%ws_minimizebox = &amp;H00020000<br />
%ws_ex_acceptfiles = &amp;H00000010<br />
%ws_ex_clientedge = &amp;H00000200<br />
%ws_ex_left = &amp;H00000000<br />
%ws_ex_ltrreading = &amp;H00000000<br />
%ws_ex_rightscrollbar = &amp;H00000000<br />
%ws_ex_controlparent = &amp;H00010000<br />
%HWND_DESKTOP = 0<br />
%idcancel = 2<br />
%mb_yesno = &amp;H00000004&amp;<br />
%mb_iconhand = &amp;H00000010&amp;<br />
%mb_iconasterisk = &amp;H00000040&amp;<br />
%mb_iconerror = %mb_iconhand<br />
%mb_iconinformation = %mb_iconasterisk<br />
%idno = 7<br />
%es_left = &amp;H0&amp;<br />
%es_multiline = &amp;H4&amp;<br />
%es_autovscroll = &amp;H40&amp;<br />
%es_autohscroll = &amp;H80&amp;<br />
%es_readonly = &amp;H800&amp;<br />
%ss_center = &amp;H00000001<br />
%ds_3dlook = &amp;H0004&amp;<br />
%ds_nofailcreate = &amp;H0010&amp;<br />
%ds_setfont = &amp;H0040&amp; ' User specified font for Dlg controls<br />
%ds_modalframe = &amp;H0080&amp; ' Can be combined with WS_CAPTION<br />
%MAXPNAMELEN = 32 ' max product name length (including NULL)<br />
%MMSYSERR_BASE = 0<br />
%MMSYSERR_NOERROR = 0 ' no error<br />
%MMSYSERR_BADDEVICEID = %MMSYSERR_BASE + 2 ' device ID out of range<br />
%MMSYSERR_NODRIVER = %MMSYSERR_BASE + 6 ' no device driver present<br />
%MMSYSERR_NOMEM = %MMSYSERR_BASE + 7 ' memory allocation error<br />
%MMSYSERR_INVALPARAM = %MMSYSERR_BASE + 11 ' invalid parameter passed<br />
<br />
Type MIDIOUTCAPS<br />
 wMid As Word<br />
 wPid As Word<br />
 vDriverVersion As Dword<br />
 szPname As Asciiz * %MAXPNAMELEN<br />
 wTechnology As Word<br />
 wVoices As Word<br />
 wNotes As Word<br />
 wChannelMask As Word<br />
 dwSupport As Dword<br />
End Type<br />
<br />
Declare Function DragQueryFile Lib "SHELL32.DLL" Alias "DragQueryFileA" (ByVal hDrop As Dword, ByVal uiFile As Dword, lpStr As Asciiz, ByVal cch As Dword) As Dword<br />
Declare Function midiOutGetDevCaps Lib "WINMM.DLL" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Dword, lpCaps As MIDIOUTCAPS, ByVal uSize As Dword) As Long<br />
Declare Sub DragAcceptFiles Lib "SHELL32.DLL" Alias "DragAcceptFiles" (ByVal hwnd As Dword, ByVal fAccept As Long)<br />
Declare Sub DragFinish Lib "SHELL32.DLL" Alias "DragFinish" (ByVal hDrop As Dword)<br />
<br />
'**************************************<br />
%Dlg = 101<br />
%Lbl = 1001<br />
%Txt = 1002<br />
<br />
'REM out "%Abbreviate" if you want the full names of drum sounds and controllers<br />
'to be Print#-ed instead of their abbreviations.<br />
%Abbreviate = 1 '(this controls compiling not operation)<br />
<br />
'de-REM "%SharpNotation" if you prefer that style<br />
%SharpNotation = 1 '(this controls compiling not operation)<br />
<br />
&#36;MidiHeader = "MThd" &amp; Chr&#36;(0, 0, 0, 6)<br />
&#36;EventPrefix = "@"<br />
&#36;Caption = "TheirCorp's MIDI Disassembler"<br />
<br />
&#36;Help = "To use:" &amp; &#36;CrLf &amp; _<br />
 "In Windows Explorer, drop a file on the program's" &amp; &#36;CrLf &amp; _<br />
 "window or on it's icon." &amp; &#36;CrLf &amp; _<br />
 "From the command line, type: ""MidiDisAsm FileName""" &amp; &#36;CrLf &amp; _<br />
 "(The file extension can be omitted)"<br />
<br />
&#36;Ascii = Chr&#36;(32 To 122)<br />
<br />
#If %def(%SharpNotation)<br />
 &#36;Notes = "C,C#,D,D#,E,F,F#,G,G#,A,A#,B"<br />
#Else<br />
 &#36;Notes = "C,Db,D,Eb,E,F,F#,G,G#,A,Bb,B"<br />
#EndIf<br />
<br />
'**************************************<br />
<br />
Global hDlg As Dword<br />
Global gs As String<br />
Global fo As Long 'output file's handle<br />
Global div As Dword 'division<br />
Global tics As Dword 'ticks<br />
Global tmpo As Dword 'tempo<br />
Global tpq As Long 'ticks per quarter-note<br />
Global sf As Double 'smpte format<br />
Global sr As Double 'smpte resolution<br />
Global moc As MIDIOUTCAPS<br />
Global InFile As String<br />
Global OutFile As String<br />
<br />
'**************************************<br />
<br />
Sub Msg(ps As String)<br />
 Control Set Text hDlg, %Txt, ps<br />
End Sub<br />
<br />
'**************************************<br />
<br />
#If %def(%Abbreviate)<br />
'**************************************<br />
'returns the GM drum sound for note number "nn"<br />
Function GetGMDrumSound(nn As Long) As String<br />
<br />
'These are numbered beginning at 35<br />
Data Acou Bass Drum<br />
Data Bass Drum1<br />
Data Side Stk<br />
Data Acou Snar<br />
Data Clap<br />
Data Elec Snar<br />
Data Lo Flr Tom<br />
Data Clsd Hi-Hat<br />
Data Hi Flr Tom<br />
Data Ped Hi-Hat<br />
Data Lo Tom<br />
Data Opn Hi-Hat<br />
Data LoMid Tom<br />
Data HiMid Tom<br />
Data Crsh Cym1<br />
Data Hi Tom<br />
Data Rid Cym1<br />
Data Chin Cym<br />
Data Rid Bell<br />
Data Tamb<br />
Data Splsh Cym<br />
Data Cwbell<br />
Data Crsh Cym2<br />
Data Vbrslp<br />
Data Rid Cym2<br />
Data Hi Bngo<br />
Data Lo Bngo<br />
Data Mut Hi Cnga<br />
Data Opn Hi Cnga<br />
Data Lo Cnga<br />
Data Hi Timb<br />
Data Lo Timb<br />
Data Hi Agog<br />
Data Lo Agog<br />
Data Cabas<br />
Data Marac<br />
Data Shrt Whst<br />
Data Lng Whst<br />
Data Shrt Guir<br />
Data Lng Guir<br />
Data Clves<br />
Data Hi Wd Blk<br />
Data Lo Wd Blk<br />
Data Mut Cuic<br />
Data Opn Cuic<br />
Data Mut Trngl<br />
Data Opn Trngl<br />
<br />
 Function = Read&#36;(nn - 34)<br />
<br />
End Function 'GetGMDrumSound<br />
<br />
'**************************************<br />
'get abbreviated controller name<br />
'cn is a zero-based controller number<br />
Function GetControllerName(cn As Long) As String<br />
<br />
'Defined Controllers<br />
Data Bank<br />
Data Mod (crs)<br />
Data Breath (crs)<br />
Data<br />
Data Foot (crs)<br />
Data Porta (crs)<br />
Data Data (crs)<br />
Data Vol (crs)<br />
Data Bal (crs)<br />
Data<br />
Data Pan (crs)<br />
Data Expr (crs)<br />
Data Eff1 (crs)<br />
Data Eff2 (crs)<br />
Data ,<br />
Data Sldr1<br />
Data Sldr2<br />
Data Sldr3<br />
Data Sldr4<br />
Data ,,,,,,,,,,,<br />
Data Bank (fin)<br />
Data Mod (fin)<br />
Data Breath (fin)<br />
Data<br />
Data Foot (fin)<br />
Data Porta (fin)<br />
Data Data (fin)<br />
Data Vol (fin)<br />
Data Bal (fin)<br />
Data<br />
Data Pan (fin)<br />
Data Expr (fin)<br />
Data Eff1 (fin)<br />
Data Eff2 (fin)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data Hold (+/-)<br />
Data Porta (+/-)<br />
Data Sust (+/-)<br />
Data Soft (+/-)<br />
Data Legato (+/-)<br />
Data Hold2 (+/-)<br />
Data Varia<br />
Data Timbre<br />
Data Release<br />
Data Attack<br />
Data Bright<br />
Data SndCtrl 6<br />
Data SndCtrl 7<br />
Data SndCtrl 8<br />
Data SndCtrl 9<br />
Data SndCtrl 10<br />
Data But1 (+/-)<br />
Data But2 (+/-)<br />
Data But3 (+/-)<br />
Data But4 (+/-)<br />
Data ,,,,,,<br />
Data Fx Lev<br />
Data Tremu<br />
Data Chorus<br />
Data Celeste<br />
Data Phaser<br />
Data Data But+<br />
Data Data But-<br />
Data NonPar (fin)<br />
Data NonPar (crs)<br />
Data RegPar (fin)<br />
Data RegPar (crs)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data AllSnds-<br />
Data AllCtrls-<br />
Data Loc Kbrd (+/-)<br />
Data AllNotes-<br />
Data Omni-<br />
Data Omni+<br />
Data MonoOper<br />
Data PolyOper<br />
<br />
Local ls As String<br />
<br />
 ls = Read&#36;(cn + 1)<br />
 Function = IIf&#36;(Len(ls), ls, "(Unk)")<br />
<br />
End Function 'GetControllerName<br />
<br />
#Else 'verbose string functions<br />
<br />
'**************************************<br />
'returns the GM drum sound for note number "nn"<br />
Function GetGMDrumSound(nn As Long) As String<br />
<br />
'These are numbered beginning at 35<br />
Data Acoustic Bass Drum<br />
Data Bass Drum 1<br />
Data Side Stick<br />
Data Acoustic Snare<br />
Data Hand Clap<br />
Data Electric Snare<br />
Data Low Floor Tom<br />
Data Closed Hi-Hat<br />
Data High Floor Tom<br />
Data Pedal Hi-Hat<br />
Data Low Tom<br />
Data Open Hi-Hat<br />
Data Low-Mid Tom<br />
Data Hi-Mid Tom<br />
Data Crash Cymbal 1<br />
Data High Tom<br />
Data Ride Cymbal 1<br />
Data Chinese Cymbal<br />
Data Ride Bell<br />
Data Tambourine<br />
Data Splash Cymbal<br />
Data Cowbell<br />
Data Crash Cymbal 2<br />
Data Vibraslap<br />
Data Ride Cymbal 2<br />
Data Hi Bongo<br />
Data Low Bongo<br />
Data Mute Hi Conga<br />
Data Open Hi Conga<br />
Data Low Conga<br />
Data High Timbale<br />
Data Low Timbale<br />
Data High Agogo<br />
Data Low Agogo<br />
Data Cabasa<br />
Data Maracas<br />
Data Short Whistle<br />
Data Long Whistle<br />
Data Short Guiro<br />
Data Long Guiro<br />
Data Claves<br />
Data Hi Wood Block<br />
Data Low Wood Block<br />
Data Mute Cuica<br />
Data Open Cuica<br />
Data Mute Triangle<br />
Data Open Triangle<br />
<br />
 Function = Read&#36;(nn - 34)<br />
<br />
End Function 'GetGMDrumSound<br />
<br />
'**************************************<br />
'get verbose controller name<br />
'cn is a zero-based controller number<br />
Function GetControllerName(cn As Long) As String<br />
<br />
'Defined Controllers<br />
Data Bank Select<br />
Data Modulation Wheel (coarse)<br />
Data Breath controller (coarse)<br />
Data<br />
Data Foot Pedal (coarse)<br />
Data Portamento Time (coarse)<br />
Data Data Entry (coarse)<br />
Data Volume (coarse)<br />
Data Balance (coarse)<br />
Data<br />
Data Pan position (coarse)<br />
Data Expression (coarse)<br />
Data Effect Control 1 (coarse)<br />
Data Effect Control 2 (coarse)<br />
Data ,<br />
Data General Purpose Slider 1<br />
Data General Purpose Slider 2<br />
Data General Purpose Slider 3<br />
Data General Purpose Slider 4<br />
Data ,,,,,,,,,,,<br />
Data Bank Select (fine)<br />
Data Modulation Wheel (fine)<br />
Data Breath controller (fine)<br />
Data<br />
Data Foot Pedal (fine)<br />
Data Portamento Time (fine)<br />
Data Data Entry (fine)<br />
Data Volume (fine)<br />
Data Balance (fine)<br />
Data<br />
Data Pan position (fine)<br />
Data Expression (fine)<br />
Data Effect Control 1 (fine)<br />
Data Effect Control 2 (fine)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data Hold Pedal (on/off)<br />
Data Portamento (on/off)<br />
Data Sustenuto Pedal (on/off)<br />
Data Soft Pedal (on/off)<br />
Data Legato Pedal (on/off)<br />
Data Hold 2 Pedal (on/off)<br />
Data Sound Variation<br />
Data Sound Timbre<br />
Data Sound Release Time<br />
Data Sound Attack Time<br />
Data Sound Brightness<br />
Data Sound Control 6<br />
Data Sound Control 7<br />
Data Sound Control 8<br />
Data Sound Control 9<br />
Data Sound Control 10<br />
Data General Purpose Button 1 (on/off)<br />
Data General Purpose Button 2 (on/off)<br />
Data General Purpose Button 3 (on/off)<br />
Data General Purpose Button 4 (on/off)<br />
Data ,,,,,,<br />
Data Effects Level<br />
Data Tremulo Level<br />
Data Chorus Level<br />
Data Celeste Level<br />
Data Phaser Level<br />
Data Data Button increment<br />
Data Data Button decrement<br />
Data Non-registered Parameter (fine)<br />
Data Non-registered Parameter (coarse)<br />
Data Registered Parameter (fine)<br />
Data Registered Parameter (coarse)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data All Sound Off<br />
Data All Controllers Off<br />
Data Local Keyboard (on/off)<br />
Data All Notes Off<br />
Data Omni Mode Off<br />
Data Omni Mode On<br />
Data Mono Operation<br />
Data Poly Operation<br />
<br />
Local ls As String<br />
<br />
 ls = Read&#36;(cn + 1)<br />
 Function = IIf&#36;(Len(ls), ls, "(Unk)")<br />
<br />
End Function 'GetControllerName<br />
<br />
#EndIf<br />
<br />
'**************************************<br />
'pn is the zero-based patch index<br />
Function GetPatchName(pn As Long) As String<br />
<br />
'----------------------------------<br />
'Piano<br />
Data Acoustic Grand<br />
Data Bright Acoustic<br />
Data Electric Grand<br />
Data ***** - Tonk<br />
Data Electric Piano 1<br />
Data Electric Piano 2<br />
Data Harpsichord<br />
Data Clav<br />
<br />
'----------------------------------<br />
'Chromatic Percussion<br />
Data Celesta<br />
Data Glockenspiel<br />
Data Music Box<br />
Data Vibraphone<br />
Data Marimba<br />
Data Xylophone<br />
Data Tubular Bells<br />
Data Dulcimer<br />
<br />
'----------------------------------<br />
'Organ<br />
Data Drawbar Organ<br />
Data Percussive Organ<br />
Data Rock Organ<br />
Data Church Organ<br />
Data Reed Organ<br />
Data Accoridan<br />
Data Harmonica<br />
Data Tango Accordian<br />
<br />
'----------------------------------<br />
'Guitar<br />
Data Acoustic Guitar(nylon)<br />
Data Acoustic Guitar(steel)<br />
Data Electric Guitar(jazz)<br />
Data Electric Guitar(clean)<br />
Data Electric Guitar(muted)<br />
Data Overdriven Guitar<br />
Data Distortion Guitar<br />
Data Guitar Harmonics<br />
<br />
'----------------------------------<br />
'Bass<br />
Data Acoustic Bass<br />
Data Electric Bass(finger)<br />
Data Electric Bass(pick)<br />
Data Fretless Bass<br />
Data Slap Bass 1<br />
Data Slap Bass 2<br />
Data Synth Bass 1<br />
Data Synth Bass 2<br />
<br />
'----------------------------------<br />
'Solo Strings<br />
Data Violin<br />
Data Viola<br />
Data Cello<br />
Data Contrabass<br />
Data Tremolo Strings<br />
Data Pizzicato Strings<br />
Data Orchestral Strings<br />
Data Timpani<br />
<br />
'----------------------------------<br />
'Ensemble<br />
Data String Ensemble 1<br />
Data String Ensemble 2<br />
Data SynthStrings 1<br />
Data SynthStrings 2<br />
Data Choir Aahs<br />
Data Voice Oohs<br />
Data Synth Voice<br />
Data Orchestra Hit<br />
<br />
'----------------------------------<br />
'Brass<br />
Data Trumpet<br />
Data Trombone<br />
Data Tuba<br />
Data Muted Trumpet<br />
Data French Horn<br />
Data Brass Section<br />
Data SynthBrass 1<br />
Data SynthBrass 2<br />
<br />
'----------------------------------<br />
'Reed<br />
Data Soprano Sax<br />
Data Sax<br />
Data Tenor Sax<br />
Data Baritone Sax<br />
Data Oboe<br />
Data English Horn<br />
Data Bassoon<br />
Data Clarinet<br />
<br />
'----------------------------------<br />
'Pipe<br />
Data Piccolo<br />
Data Flute<br />
Data Recorder<br />
Data Pan Flute<br />
Data Blown Bottle<br />
Data Skakuhachi<br />
Data Whistle<br />
Data Ocarina<br />
<br />
'----------------------------------<br />
'Synth Lead<br />
Data Lead 1 (square)<br />
Data Lead 2 (sawtooth)<br />
Data Lead 3 (calliope)<br />
Data Lead 4 (chiff)<br />
Data Lead 5 (charang)<br />
Data Lead 6 (voice)<br />
Data Lead 7 (fifths)<br />
Data Lead 8 (bass + lead)<br />
<br />
'----------------------------------<br />
'Synth Pad<br />
Data Pad 1 (new age)<br />
Data Pad 2 (warm)<br />
Data Pad 3 (polysynth)<br />
Data Pad 4 (choir)<br />
Data Pad 5 (bowed)<br />
Data Pad 6 (metallic)<br />
Data Pad 7 (halo)<br />
Data Pad 8 (sweep)<br />
<br />
'----------------------------------<br />
'Synth Effects<br />
Data FX 1 (rain)<br />
Data FX 2 (soundtrack)<br />
Data FX 3 (crystal)<br />
Data FX 4 (atmosphere)<br />
Data FX 5 (brightness)<br />
Data FX 6 (goblins)<br />
Data FX 7 (echoes)<br />
Data FX 8 (sci-fi)<br />
<br />
'----------------------------------<br />
'Ethnic<br />
Data Sitar<br />
Data Banjo<br />
Data Shamisen<br />
Data Koto<br />
Data Kalimba<br />
Data Bagpipe<br />
Data Fiddle<br />
Data Shanai<br />
<br />
'----------------------------------<br />
'Percussive<br />
Data Tinkle Bell<br />
Data Agogo<br />
Data Steel Drums<br />
Data Woodblock<br />
Data Taiko Drum<br />
Data Melodic Tom<br />
Data Synth Drum<br />
Data Reverse Cymbal<br />
<br />
'----------------------------------<br />
'Sound Effects<br />
Data Guitar Fret Noise<br />
Data Breath Noise<br />
Data Seashore<br />
Data Bird Tweet<br />
Data Telephone Ring<br />
Data Helicopter<br />
Data Applause<br />
Data Gunshot<br />
<br />
 Function = Read&#36;(pn + 1)<br />
<br />
End Function 'GetPatchName<br />
<br />
'**************************************<br />
'for SysEx events<br />
'mn is a one-based, manufacturer's ID number<br />
'(not sure how up to date the list is)<br />
Function GetManufacturerName(mn As Long) As String<br />
<br />
'Here are the Manufacturer which have ID numbers assigned:<br />
Data Sequential Circuits<br />
Data Big Briar<br />
Data Octave / Plateau<br />
Data Moog 4<br />
Data Passport Designs<br />
Data Lexicon<br />
Data Kurzweil<br />
Data Fender<br />
Data Gulbransen<br />
Data Delta Labs<br />
Data Sound Comp.<br />
Data General Electro<br />
Data Techmar<br />
Data Matthews Research<br />
Data<br />
<br />
Data Oberheim<br />
Data PAIA<br />
Data Simmons<br />
Data DigiDesign<br />
Data Fairlight<br />
Data JL Cooper<br />
Data Lowery<br />
Data Lin<br />
Data Emu<br />
Data ,<br />
Data Peavey<br />
Data ,,,<br />
<br />
Data Bon Tempi<br />
Data S.I.E.L.<br />
Data<br />
Data SyntheAxe<br />
Data Hohner<br />
Data Crumar<br />
Data Solton<br />
Data Jellinghaus Ms<br />
Data CTS<br />
Data PPG<br />
Data ,,,,<br />
Data Elka<br />
<br />
Data ,,,,,<br />
Data Cheetah<br />
Data ,,,,,,<br />
Data Waldorf<br />
Data<br />
<br />
Data Kawai<br />
Data Roland<br />
Data Korg<br />
Data Yamaha<br />
Data Casio<br />
Data Akai<br />
<br />
Local ls As String<br />
<br />
 Select Case mn<br />
 Case &lt; &amp;H46 : ls = Read&#36;(mn)<br />
 Case = &amp;H7E : ls = "Non-RealTime (universal)"<br />
 Case = &amp;H7F : ls = "RealTime (universal)"<br />
 End Select<br />
<br />
 Function = IIf&#36;(Len(ls), ls, "(Unk)")<br />
<br />
End Function 'GetManufacturerName<br />
<br />
'**************************************<br />
'returns a variable-length data value<br />
'this modifies p to point it at the last byte of<br />
'variable-length data<br />
Function VarLen(tk As String, ByRef p As Long) As Long<br />
Local b As Long<br />
Local n As Long<br />
Local td As Dword<br />
<br />
 Do<br />
 Incr n<br />
 b = Asc(tk, p)<br />
 Shift Left td, 7<br />
 td = td + (b And 127)<br />
 If (b And &amp;H80) = 0 Then Exit Do<br />
 Incr p<br />
<br />
 Loop While (n &lt; 5) And (p &lt;= Len(tk))<br />
<br />
 Function = td<br />
<br />
End Function<br />
<br />
'**************************************<br />
'Octave| | Note Numbers<br />
' # | |<br />
' | | C | C# | D | D# | E | F | F# | G | G# | A | A# | B<br />
'-----------------------------------------------------------------------------<br />
' 0 | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11<br />
' 1 | | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23<br />
' 2 | | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35<br />
' 3 | | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47<br />
' 4 | | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59<br />
' 5 | | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71<br />
' 6 | | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83<br />
' 7 | | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95<br />
' 8 | | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107<br />
' 9 | | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119<br />
' 10 | | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 |<br />
<br />
Function GetNoteName(nn As Long) As String<br />
 Function = Parse&#36;(&#36;Notes, (nn Mod 12) + 1) &amp; " (" &amp; Format&#36;(nn&#92;12) &amp; ")"<br />
End Function 'GetNoteName<br />
<br />
'**************************************<br />
'returns a string to display the total<br />
'delta-time ticks elapsed since the start of<br />
'the current track<br />
'resets the time if dt = &amp;HFFFFFFFF???<br />
Function FormatTime(dt As Dword) As String<br />
Static tm As Quad<br />
<br />
 If dt = &amp;HFFFFFFFF??? Then tm = 0 : Exit Function 'reset the time<br />
 tm = tm + dt 'update the time<br />
<br />
 Function = Using&#36;("#,", tm)<br />
<br />
End Function 'FormatTime<br />
<br />
'**************************************<br />
'p must arrive pointing at the meta-event's code<br />
Function DisMetaEvent(tk As String, ByVal p As Long, ByVal dt As Dword) As Long<br />
Local ev As Long 'event code<br />
Local n As Long<br />
Local pf As Long '"Print#" flag<br />
Local x As Long<br />
Local ls As String<br />
Local ts As String<br />
Local td As Dword 'temporary DWord<br />
<br />
<br />
 Dim ab(3) As Byte At VarPtr(td)<br />
<br />
 'get the event code and channel number<br />
 ev = Asc(tk, p)<br />
<br />
 Incr p<br />
 n = VarLen(tk, p)<br />
<br />
 'get the event's data<br />
 Incr p<br />
 ls = Mid&#36;(tk, p, n)<br />
<br />
 Incr pf 'enable Print#-ing<br />
<br />
 '----------------------------------<br />
 'decode the event<br />
 Select Case ev<br />
<br />
 ' Set Track Sequence Number<br />
 Case &amp;H00<br />
 td = CvWrd(ls)<br />
 Swap ab(0), ab(1)<br />
 ls = "Sequence= " &amp; Format&#36;(td)<br />
<br />
 ' Text<br />
 Case &amp;H01<br />
 ls = "Text {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Copyright Info<br />
 Case &amp;H02<br />
 ls = "CopyRight {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Sequence or Track Name<br />
 Case &amp;H03<br />
 ls = "TrackName {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Track Instrument Name<br />
 Case &amp;H04<br />
 ls = "Instrument {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Lyric<br />
 Case &amp;H05<br />
 ls = "Lyric {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Marker<br />
 Case &amp;H06<br />
 ls = "Marker {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Cue Point<br />
 Case &amp;H07<br />
 ls = "CuePoint {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' MIDI Channel<br />
 Case &amp;H07<br />
 ls = "MidiChannel= " &amp; Format&#36;(Asc(ls) + 1)<br />
<br />
 ' Device Name Assigned to MIDI Port<br />
 Case &amp;H21<br />
 x = Asc(ls)<br />
 ls = "Error getting device name:" &amp; &#36;CrLf<br />
 Select Case midiOutGetDevCaps(x, moc, SizeOf(MIDIOUTCAPS))<br />
 Case %MMSYSERR_BADDEVICEID<br />
 ls = ls &amp; """The specified device identifier is out of range."""<br />
 Case %MMSYSERR_INVALPARAM<br />
 ls = ls &amp; """The specified pointer or structure is invalid."""<br />
 Case %MMSYSERR_NODRIVER<br />
 ls = ls &amp; """The driver is not installed."""<br />
 Case %MMSYSERR_NOMEM<br />
 ls = ls &amp; """The system is unable to load mapper string description."""<br />
 Case %MMSYSERR_NOERROR<br />
 ls = "DeviceName= " &amp; moc.szPname<br />
 End Select<br />
<br />
 ' End of Track<br />
 Case &amp;H2F<br />
 ls = "EndOfTrack"<br />
<br />
 ' Set Tempo<br />
 Case &amp;H51<br />
 td = CvDwd(ls)<br />
 GoSub ToggleEndian<br />
 Shift Right td, 8<br />
 tmpo = 60000000/td<br />
 ls = "Tempo=" &amp; Format&#36;(tmpo) &amp; " (" &amp; Format&#36;(td) &amp; " mms per 1/4 note)"<br />
<br />
 ' SMPTE Offset<br />
 Case &amp;H54 '(not implemented)<br />
<br />
 ' Time Signature<br />
 Case &amp;H58<br />
 ts = ls<br />
 ls = "TimeSignature {" &amp; &#36;Lf<br />
 ls = ls &amp; Format&#36;(Asc(ts, 1)) &amp; "/" &amp; Format&#36;(2 ^ Asc(ts, 2)) &amp; &#36;Lf<br />
 ls = ls &amp; "Ticks/metronome click= " &amp; Format&#36;(Asc(ts, 3)) &amp; &#36;Lf<br />
 ls = ls &amp; "32nd notes/quarter= " &amp; Format&#36;(Asc(ts, 4)) &amp; &#36;Lf &amp; "}"<br />
<br />
 ' Key Signature<br />
 Case &amp;H59<br />
 x = Asc(ls, 1)<br />
 If Bit(x, 7) Then x = x Or &amp;HFFFFFF00<br />
<br />
 If x &lt;&gt; 0 Then<br />
 ts = String&#36;(Abs(x), IIf&#36;(x &gt; 0, "#", "b")) &amp; IIf&#36;(Asc(ls, 2), " Min", " Maj")<br />
 Else<br />
 ts = "(Nat)"<br />
 End If<br />
<br />
 ls = "KeySignature: " &amp; ts<br />
<br />
 ' Proprietary (sequencer-specific information)<br />
 Case &amp;H7F<br />
 ts = ls<br />
 ls = "Proprietary {" &amp; &#36;Lf<br />
 ls = ls &amp; "Program ID: " &amp; Left&#36;(ts, Min(4, Verify(ts, &#36;Ascii) - 1)) &amp; &#36;Lf<br />
<br />
 For x = 1 To Len(ts)<br />
 ls = ls &amp; Hex&#36;(Asc(ts, x), 2) &amp; &#36;Spc<br />
 If x Mod 16 = 0 Then ls = ls &amp; &#36;Lf<br />
 Next x<br />
<br />
 ls = ls &amp; "}"<br />
<br />
 Case Else<br />
 ls = "UnkownMetaEvent: &amp;H" &amp; Hex&#36;(ev, 2)<br />
<br />
 End Select<br />
<br />
 If pf Then<br />
 Replace &#36;Lf With &#36;CrLf In ls<br />
 Print# fo, FormatTime(dt) &amp; &#36;Tab &amp; &#36;EventPrefix &amp; ls<br />
 End If<br />
<br />
 Function = p + n - 1<br />
<br />
 Exit Function<br />
<br />
ToggleEndian:<br />
 Swap ab(0), ab(3)<br />
 Swap ab(1), ab(2)<br />
Return<br />
<br />
End Function 'DisMetaEvent<br />
<br />
'**************************************<br />
<br />
Function DisTrack(tk As String) As Long<br />
Local ev As Long<br />
Local dt As Dword 'delta time<br />
Local ch As Long 'channel<br />
<br />
Local cn As Long 'controller number<br />
Local nn As Long 'note number<br />
Local ve As Long 'velocity<br />
Local pn As Long 'patch number<br />
<br />
Local pw As Long 'pitch wheel<br />
Local nv As Long '"new value"<br />
<br />
Local pf As Long '"Print#" flag<br />
Local wf As Long 'warning flag<br />
<br />
Local n As Long<br />
Local p As Long<br />
Local tc As String 'time and channel<br />
Local ls As String<br />
Local ts As String<br />
<br />
<br />
 For p = 1 To Len(tk)<br />
<br />
 dt = VarLen(tk, p) 'get the delta-time<br />
<br />
 Incr p<br />
 n = Asc(tk, p)<br />
<br />
 'if no event byte is present, the last one is assumed to be intended<br />
 If (n And 128) Then<br />
 ev = n<br />
 Incr p<br />
 End If<br />
<br />
 ch = (ev And 15) + 1<br />
 ls = FormatTime(dt) &amp; &#36;Tab &amp; "Ch=" &amp; Format&#36;(ch) &amp; ": " &amp; &#36;EventPrefix<br />
<br />
 Incr pf 'enable Print#-ing<br />
<br />
 '----------------------------------<br />
 'decode the event<br />
 Select Case ev<br />
<br />
 'just in case...<br />
 Case &lt; &amp;H80<br />
 ls = "Running Mode Error!"<br />
<br />
 ' Note Off<br />
 Case &lt; &amp;H90<br />
 nn = Asc(tk, p)<br />
 Incr p<br />
 ve = Asc(tk, p)<br />
 ls = Left&#36;(ls, Len(ls) - 1) &amp; " - " &amp; IIf&#36;(ch = 10, GetGMDrumSound(nn), GetNoteName(nn)) &amp; &#36;Tab &amp; "V=" &amp; Format&#36;(ve)<br />
<br />
 ' Note On<br />
 Case &lt; &amp;HA0<br />
 nn = Asc(tk, p)<br />
 Incr p<br />
 ve = Asc(tk, p)<br />
 ls = Left&#36;(ls, Len(ls) - 1) &amp; IIf&#36;(ve, "+ ", "z ") &amp; IIf&#36;(ch = 10, GetGMDrumSound(nn), GetNoteName(nn))<br />
 ls = ls &amp; IIf&#36;(ve, &#36;Tab &amp; "V=" &amp; Format&#36;(ve), "")<br />
<br />
 ' Key After-Touch<br />
 Case &lt; &amp;HB0<br />
 nn = Asc(tk, p)<br />
 Incr p<br />
 ve = Asc(tk, p)<br />
 ls = ls &amp; "Touch:" &amp; &#36;Tab &amp; IIf&#36;(ch = 10, GetGMDrumSound(nn), GetNoteName(nn)) &amp; &#36;Tab &amp; "V=" &amp; Format&#36;(ve)<br />
<br />
 ' Control Change<br />
 Case &lt; &amp;HC0<br />
 cn = Asc(tk, p)<br />
 Incr p<br />
 nv = Asc(tk, p)<br />
 ls = ls &amp; "Ctrl:" &amp; GetControllerName(cn) &amp; "=" &amp; Format&#36;(nv)<br />
<br />
 ' Program (Patch) Change<br />
 Case &lt; &amp;HD0<br />
 pn = Asc(tk, p)<br />
 ls = ls &amp; "Patch= " &amp; GetPatchName(pn)<br />
<br />
 ' Channel Pressure<br />
 Case &lt; &amp;HE0<br />
 cn = Asc(tk, p)<br />
 ls = ls &amp; "ChanPress=" &amp; Format&#36;(cn)<br />
<br />
 ' Pitch Wheel Change<br />
 Case &lt; &amp;HF0<br />
 pw = Asc(tk, p) And 127<br />
 Incr p<br />
 pw = pw + ((Asc(tk, p) And 127) * 128)<br />
 ls = ls &amp; "Wheel= " &amp; Format&#36;(pw - &amp;H2000&amp;)<br />
<br />
 ' System Exclusive<br />
 Case &amp;HF0<br />
<br />
 ls = FormatTime(dt) &amp; &#36;Tab &amp; &#36;EventPrefix &amp; "SysEx: (hex format) {" &amp; &#36;CrLf<br />
<br />
 n = p + VarLen(tk, p)<br />
 ls = ls &amp; "Manufacturer: " &amp; GetManufacturerName(Asc(tk, p)) &amp; &#36;CrLf<br />
 Do While p &lt; n<br />
 Incr p<br />
 ls = ls &amp; &#36;Spc &amp; Hex&#36;(Asc(tk, p), 2)<br />
 If (n - p) Mod 16 = 0 Then ls = ls &amp; &#36;CrLf<br />
 Loop<br />
<br />
 ls = ls &amp; "}"<br />
<br />
 'Song Position (not implemented)<br />
 Case &amp;HF2<br />
 Incr wf<br />
 ls = ls &amp; "SongPosition"<br />
<br />
 'Song Select (not implemented)<br />
 Case &amp;HF3<br />
 Incr wf<br />
 ls = ls &amp; "SongSelect"<br />
<br />
 'Unofficial Bus Select (not implemented)<br />
 Case &amp;HF5<br />
 Incr wf<br />
 ls = ls &amp; "UnofficialBusSelect"<br />
<br />
 'Tune Request (not implemented)<br />
 Case &amp;HF6<br />
 Incr wf<br />
 ls = ls &amp; "TuneRequest"<br />
<br />
 'End of SysEx<br />
 'Case &amp;HF7<br />
 'this should always be caught in a SysEx event, so it's REM-ed out<br />
 ' Incr wf<br />
 ' ls = "}"<br />
<br />
 'Timing Tick (not implemented)<br />
 Case &amp;HF8<br />
 Incr wf<br />
 ls = ls &amp; "TimingTick"<br />
<br />
 'Start Current Sequence (not implemented)<br />
 Case &amp;HFA<br />
 Incr wf<br />
 ls = ls &amp; "StartCurrentSeq"<br />
<br />
 'Continue Stopped Sequence (not implemented)<br />
 Case &amp;HFB<br />
 Incr wf<br />
 ls = ls &amp; "ContinueSeq"<br />
<br />
 'Stop Sequence (not implemented)<br />
 Case &amp;HFC<br />
 Incr wf<br />
 ls = ls &amp; "StopSeq"<br />
<br />
 'Active Sensing (not implemented)<br />
 Case &amp;HFE<br />
 Incr wf<br />
 ls = ls &amp; "ActiveSensing"<br />
<br />
 'Meta-Event<br />
 Case &amp;HFF<br />
 p = DisMetaEvent(tk, p, dt)<br />
 pf = 0<br />
<br />
 End Select<br />
<br />
 If pf Then Print# fo, ls<br />
 If wf Then<br />
 gs = "Found an unimplemented command, aborting track..."<br />
 Msg gs<br />
 Print# fo, gs<br />
 Exit Function<br />
 End If<br />
<br />
 Next p<br />
<br />
End Function<br />
<br />
'**************************************<br />
'if dr &lt;&gt; 0 then the file was dropped on to the<br />
'dialog rather than dropped on the icon or entered<br />
'at the command line.<br />
Function MidiMain(dr As Long) As Long<br />
Local fi As Long 'input file<br />
Local n As Long<br />
Local trks As Long 'number of tracks<br />
Local tn As Long 'track number<br />
Local tlen As Long 'track length<br />
Local td As Dword 'temporary DWord<br />
Local ls As String<br />
Local tk As String<br />
<br />
 Dim ab(3) As Byte At VarPtr(td)<br />
<br />
 If dr = 0 Then<br />
 If InStr(",H,HELP,-H,-HELP,/H,/HELP,", "," &amp; UCase&#36;(InFile) &amp; ",") Then<br />
 MsgBox &#36;Help, %mb_iconinformation, &#36;Caption<br />
 Exit Function<br />
 End If<br />
 End If<br />
<br />
<br />
 'add file extension if needed<br />
 If InStr(InFile, ".") = 0 Then<br />
 InFile = InFile &amp; ".MID"<br />
 ElseIf UCase&#36;(Right&#36;(InFile, 4)) &lt;&gt; ".MID" Then 'check file extension<br />
 gs = "Error:" &amp; &#36;CrLf &amp; "Incorrect file extension. It must be a "".MID"" file"<br />
 If dr Then Msg gs Else MsgBox gs, %mb_iconerror, &#36;Caption<br />
 Exit Function<br />
 End If<br />
<br />
<br />
 If Len(Dir&#36;(InFile)) = 0 Then<br />
 gs = "Error: Couldn't find " &amp; &#36;CrLf &amp; """" &amp; InFile &amp; """"<br />
 If dr Then Msg gs Else MsgBox gs, %mb_iconerror, &#36;Caption<br />
 Exit Function<br />
 End If<br />
<br />
<br />
 OutFile = Left&#36;(InFile, Len(InFile) - 3) &amp; "txt"<br />
 If Len(Dir&#36;(OutFile)) Then<br />
 If MsgBox("Over-write:" &amp; &#36;CrLf &amp; OutFile &amp; "?", %mb_yesno, &#36;Caption) = %idno Then Exit Function<br />
 End If<br />
<br />
 '----------------------------------<br />
 fi = FreeFile<br />
 Open InFile For Binary As #fi<br />
<br />
 fo = FreeFile<br />
 Open OutFile For Output As #fo<br />
<br />
 '----------------------------------<br />
 Get&#36; #fi, 8, ls<br />
 If ls &lt;&gt; &#36;MidiHeader Then<br />
 gs = "Error: bad header"<br />
 If dr Then Msg gs Else MsgBox gs<br />
 Exit Function<br />
 End If<br />
<br />
<br />
 '----------------------------------<br />
 Get&#36; #fi, 2, ls 'get the track format<br />
 Print# fo, "Format= " &amp; Choose&#36;(Asc(ls, 2) + 1, _<br />
 "Single-Track", "Multi-Track, Synchronous", _<br />
 "Multi-Track, Asynchronous")<br />
<br />
 '----------------------------------<br />
 Get&#36; #fi, 2, ls 'get number of tracks<br />
 trks = (Asc(ls, 1) * 256) + Asc(ls, 2)<br />
 Print# fo, "Tracks=" &amp; Format&#36;(trks)<br />
<br />
<br />
 '-----------------------------------------------------------------------<br />
 tmpo = 120 'set the default BPM<br />
<br />
 Get&#36; #fi, 2, ls 'get the delta-time ticks per quarter note<br />
 div = Asc(ls, 1)<br />
 If Bit(div, 7) Then<br />
 !'Note: This might not give correct results for SMPTE !<br />
 sf = Abs(CLng(div Or &amp;HFFFFFF00???))<br />
 sr = Asc(ls, 2)<br />
 tpq = sf * sr * 1000000.0<br />
 ls = "SMPTE divisions per quarter-note= "<br />
<br />
 Else<br />
 tpq = (div * 256) + Asc(ls, 2)<br />
 ls = "Delta-time ticks per quarter note= "<br />
<br />
 End If<br />
<br />
 Print# fo, ls &amp; Format&#36;(tpq)<br />
<br />
<br />
 '----------------------------------<br />
 'Dump the tracks<br />
 Do<br />
<br />
 '----------------------------------<br />
 'get the track header<br />
 Get&#36; #fi, 4, ls<br />
 If ls &lt;&gt; "MTrk" Then Exit Do 'bad header<br />
<br />
 Print# fo,<br />
 Print# fo, "****************************************"<br />
<br />
 '----------------------------------<br />
 'get track's length in bytes<br />
 Get&#36; #fi, 4, ls<br />
 td = CvDwd(ls)<br />
 Swap ab(0), ab(3)<br />
 Swap ab(1), ab(2)<br />
 tlen = td<br />
<br />
 Print# fo, "Track=" &amp; Format&#36;(tn) &amp; &#36;Tab &amp; "Bytes=" &amp; Format&#36;(tlen)<br />
 Get&#36; #fi, tlen, tk 'get the track's contents<br />
<br />
 FormatTime(&amp;HFFFFFFFF???)<br />
<br />
 DisTrack(tk)<br />
<br />
 Incr tn 'next track number<br />
<br />
 Loop Until Eof(1)<br />
<br />
 Close# fi, #fo<br />
<br />
 gs = "Done with """ &amp; InFile &amp; """." &amp; &#36;CrLf &amp; "The output is in """ &amp; OutFile &amp; """"<br />
 If dr Then Msg gs Else MsgBox gs<br />
<br />
End Function 'MidiMain<br />
<br />
'**************************************<br />
<br />
CallBack Function ShowDlgProc()<br />
Local n As Long<br />
<br />
 Select Case As Long CbMsg<br />
<br />
 Case %wm_initdialog<br />
 Msg &#36;Help<br />
 DragAcceptFiles hDlg, %TRUE<br />
<br />
 Case %WM_DROPFILES<br />
 InFile = String&#36;(%MAX_PATH, &#36;Nul)<br />
 n = DragQueryFile(CbWParam, -1, ByVal 0, 0)<br />
 DragQueryFile CbWParam, 0, ByVal StrPtr(InFile), %MAX_PATH<br />
 DragFinish CbWParam<br />
 InFile = RTrim&#36;(InFile, &#36;Nul)<br />
 Msg "Processing: """ &amp; InFile &amp; """"<br />
 MidiMain 1<br />
<br />
 Case %wm_command<br />
 Select Case As Long CbCtl<br />
 Case %idcancel<br />
 Dialog End hDlg<br />
<br />
 End Select<br />
<br />
 End Select<br />
<br />
End Function<br />
<br />
'**************************************<br />
<br />
Function PBMain() As Long<br />
 Local lRslt As Long<br />
<br />
 InFile = Trim&#36;(Command&#36;, Any " """)<br />
 If Len(InFile) Then<br />
 MidiMain 0<br />
 Exit Function<br />
 End If<br />
<br />
 Dialog New %HWND_DESKTOP, &#36;Caption, 286, 65, 189, 65, _<br />
 %ws_popup Or %ws_border Or %ws_dlgframe Or %ws_caption Or _<br />
 %ws_sysmenu Or %ws_minimizebox Or %ws_clipsiblings Or %ws_visible Or _<br />
 %ds_modalframe Or %ds_3dlook Or %ds_nofailcreate Or %ds_setfont, _<br />
 %ws_ex_acceptfiles Or %ws_ex_controlparent Or %ws_ex_left Or _<br />
 %ws_ex_ltrreading Or %ws_ex_rightscrollbar, To hDlg<br />
 Control Add Label, hDlg, %Lbl, "Drop "".MID"" files onto this window", _<br />
 0, 4, 188, 14, %ws_child Or %ws_visible Or %ss_center, %ws_ex_left Or _<br />
 %ws_ex_ltrreading<br />
 Control Add TextBox, hDlg, %Txt, "", 0, 19, 188, 45, %ws_child Or _<br />
 %ws_visible Or %ws_tabstop Or %es_left Or %es_multiline Or _<br />
 %es_autohscroll Or %es_autovscroll Or %es_readonly, _<br />
 %ws_ex_clientedge Or %ws_ex_left Or %ws_ex_ltrreading Or _<br />
 %ws_ex_rightscrollbar<br />
<br />
 Dialog Show Modal hDlg, Call ShowDlgProc To lRslt<br />
<br />
 DragAcceptFiles hdlg, %FALSE<br />
<br />
 Function = lRslt<br />
<br />
End Function<br />
<br />
'**************************************</code></div></div>]]></description>
			<content:encoded><![CDATA[برنامه رو کامپایل و باز کنید،سپس فایل MIDI رو گرفته و به دورن برنامه بیندازید و اطلاعات را ذخیره کنید<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe "MidiDisAsm.exe"<br />
#Dim All<br />
#Register All<br />
'**************************************<br />
'from IncLean file<br />
%WINAPI = 1<br />
%TRUE = 1<br />
%FALSE = 0<br />
%MAX_PATH = 260 ' max. length of full pathname<br />
%wm_destroy = &amp;H2<br />
%wm_initdialog = &amp;H110<br />
%wm_command = &amp;H111<br />
%WM_DROPFILES = &amp;H233<br />
%ws_popup = &amp;H80000000<br />
%ws_child = &amp;H40000000<br />
%ws_visible = &amp;H10000000<br />
%ws_clipsiblings = &amp;H04000000<br />
%ws_caption = &amp;H00C00000 ' WS_BORDER OR WS_DLGFRAME<br />
%ws_border = &amp;H00800000<br />
%ws_dlgframe = &amp;H00400000<br />
%ws_sysmenu = &amp;H00080000<br />
%ws_tabstop = &amp;H00010000<br />
%ws_minimizebox = &amp;H00020000<br />
%ws_ex_acceptfiles = &amp;H00000010<br />
%ws_ex_clientedge = &amp;H00000200<br />
%ws_ex_left = &amp;H00000000<br />
%ws_ex_ltrreading = &amp;H00000000<br />
%ws_ex_rightscrollbar = &amp;H00000000<br />
%ws_ex_controlparent = &amp;H00010000<br />
%HWND_DESKTOP = 0<br />
%idcancel = 2<br />
%mb_yesno = &amp;H00000004&amp;<br />
%mb_iconhand = &amp;H00000010&amp;<br />
%mb_iconasterisk = &amp;H00000040&amp;<br />
%mb_iconerror = %mb_iconhand<br />
%mb_iconinformation = %mb_iconasterisk<br />
%idno = 7<br />
%es_left = &amp;H0&amp;<br />
%es_multiline = &amp;H4&amp;<br />
%es_autovscroll = &amp;H40&amp;<br />
%es_autohscroll = &amp;H80&amp;<br />
%es_readonly = &amp;H800&amp;<br />
%ss_center = &amp;H00000001<br />
%ds_3dlook = &amp;H0004&amp;<br />
%ds_nofailcreate = &amp;H0010&amp;<br />
%ds_setfont = &amp;H0040&amp; ' User specified font for Dlg controls<br />
%ds_modalframe = &amp;H0080&amp; ' Can be combined with WS_CAPTION<br />
%MAXPNAMELEN = 32 ' max product name length (including NULL)<br />
%MMSYSERR_BASE = 0<br />
%MMSYSERR_NOERROR = 0 ' no error<br />
%MMSYSERR_BADDEVICEID = %MMSYSERR_BASE + 2 ' device ID out of range<br />
%MMSYSERR_NODRIVER = %MMSYSERR_BASE + 6 ' no device driver present<br />
%MMSYSERR_NOMEM = %MMSYSERR_BASE + 7 ' memory allocation error<br />
%MMSYSERR_INVALPARAM = %MMSYSERR_BASE + 11 ' invalid parameter passed<br />
<br />
Type MIDIOUTCAPS<br />
 wMid As Word<br />
 wPid As Word<br />
 vDriverVersion As Dword<br />
 szPname As Asciiz * %MAXPNAMELEN<br />
 wTechnology As Word<br />
 wVoices As Word<br />
 wNotes As Word<br />
 wChannelMask As Word<br />
 dwSupport As Dword<br />
End Type<br />
<br />
Declare Function DragQueryFile Lib "SHELL32.DLL" Alias "DragQueryFileA" (ByVal hDrop As Dword, ByVal uiFile As Dword, lpStr As Asciiz, ByVal cch As Dword) As Dword<br />
Declare Function midiOutGetDevCaps Lib "WINMM.DLL" Alias "midiOutGetDevCapsA" (ByVal uDeviceID As Dword, lpCaps As MIDIOUTCAPS, ByVal uSize As Dword) As Long<br />
Declare Sub DragAcceptFiles Lib "SHELL32.DLL" Alias "DragAcceptFiles" (ByVal hwnd As Dword, ByVal fAccept As Long)<br />
Declare Sub DragFinish Lib "SHELL32.DLL" Alias "DragFinish" (ByVal hDrop As Dword)<br />
<br />
'**************************************<br />
%Dlg = 101<br />
%Lbl = 1001<br />
%Txt = 1002<br />
<br />
'REM out "%Abbreviate" if you want the full names of drum sounds and controllers<br />
'to be Print#-ed instead of their abbreviations.<br />
%Abbreviate = 1 '(this controls compiling not operation)<br />
<br />
'de-REM "%SharpNotation" if you prefer that style<br />
%SharpNotation = 1 '(this controls compiling not operation)<br />
<br />
&#36;MidiHeader = "MThd" &amp; Chr&#36;(0, 0, 0, 6)<br />
&#36;EventPrefix = "@"<br />
&#36;Caption = "TheirCorp's MIDI Disassembler"<br />
<br />
&#36;Help = "To use:" &amp; &#36;CrLf &amp; _<br />
 "In Windows Explorer, drop a file on the program's" &amp; &#36;CrLf &amp; _<br />
 "window or on it's icon." &amp; &#36;CrLf &amp; _<br />
 "From the command line, type: ""MidiDisAsm FileName""" &amp; &#36;CrLf &amp; _<br />
 "(The file extension can be omitted)"<br />
<br />
&#36;Ascii = Chr&#36;(32 To 122)<br />
<br />
#If %def(%SharpNotation)<br />
 &#36;Notes = "C,C#,D,D#,E,F,F#,G,G#,A,A#,B"<br />
#Else<br />
 &#36;Notes = "C,Db,D,Eb,E,F,F#,G,G#,A,Bb,B"<br />
#EndIf<br />
<br />
'**************************************<br />
<br />
Global hDlg As Dword<br />
Global gs As String<br />
Global fo As Long 'output file's handle<br />
Global div As Dword 'division<br />
Global tics As Dword 'ticks<br />
Global tmpo As Dword 'tempo<br />
Global tpq As Long 'ticks per quarter-note<br />
Global sf As Double 'smpte format<br />
Global sr As Double 'smpte resolution<br />
Global moc As MIDIOUTCAPS<br />
Global InFile As String<br />
Global OutFile As String<br />
<br />
'**************************************<br />
<br />
Sub Msg(ps As String)<br />
 Control Set Text hDlg, %Txt, ps<br />
End Sub<br />
<br />
'**************************************<br />
<br />
#If %def(%Abbreviate)<br />
'**************************************<br />
'returns the GM drum sound for note number "nn"<br />
Function GetGMDrumSound(nn As Long) As String<br />
<br />
'These are numbered beginning at 35<br />
Data Acou Bass Drum<br />
Data Bass Drum1<br />
Data Side Stk<br />
Data Acou Snar<br />
Data Clap<br />
Data Elec Snar<br />
Data Lo Flr Tom<br />
Data Clsd Hi-Hat<br />
Data Hi Flr Tom<br />
Data Ped Hi-Hat<br />
Data Lo Tom<br />
Data Opn Hi-Hat<br />
Data LoMid Tom<br />
Data HiMid Tom<br />
Data Crsh Cym1<br />
Data Hi Tom<br />
Data Rid Cym1<br />
Data Chin Cym<br />
Data Rid Bell<br />
Data Tamb<br />
Data Splsh Cym<br />
Data Cwbell<br />
Data Crsh Cym2<br />
Data Vbrslp<br />
Data Rid Cym2<br />
Data Hi Bngo<br />
Data Lo Bngo<br />
Data Mut Hi Cnga<br />
Data Opn Hi Cnga<br />
Data Lo Cnga<br />
Data Hi Timb<br />
Data Lo Timb<br />
Data Hi Agog<br />
Data Lo Agog<br />
Data Cabas<br />
Data Marac<br />
Data Shrt Whst<br />
Data Lng Whst<br />
Data Shrt Guir<br />
Data Lng Guir<br />
Data Clves<br />
Data Hi Wd Blk<br />
Data Lo Wd Blk<br />
Data Mut Cuic<br />
Data Opn Cuic<br />
Data Mut Trngl<br />
Data Opn Trngl<br />
<br />
 Function = Read&#36;(nn - 34)<br />
<br />
End Function 'GetGMDrumSound<br />
<br />
'**************************************<br />
'get abbreviated controller name<br />
'cn is a zero-based controller number<br />
Function GetControllerName(cn As Long) As String<br />
<br />
'Defined Controllers<br />
Data Bank<br />
Data Mod (crs)<br />
Data Breath (crs)<br />
Data<br />
Data Foot (crs)<br />
Data Porta (crs)<br />
Data Data (crs)<br />
Data Vol (crs)<br />
Data Bal (crs)<br />
Data<br />
Data Pan (crs)<br />
Data Expr (crs)<br />
Data Eff1 (crs)<br />
Data Eff2 (crs)<br />
Data ,<br />
Data Sldr1<br />
Data Sldr2<br />
Data Sldr3<br />
Data Sldr4<br />
Data ,,,,,,,,,,,<br />
Data Bank (fin)<br />
Data Mod (fin)<br />
Data Breath (fin)<br />
Data<br />
Data Foot (fin)<br />
Data Porta (fin)<br />
Data Data (fin)<br />
Data Vol (fin)<br />
Data Bal (fin)<br />
Data<br />
Data Pan (fin)<br />
Data Expr (fin)<br />
Data Eff1 (fin)<br />
Data Eff2 (fin)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data Hold (+/-)<br />
Data Porta (+/-)<br />
Data Sust (+/-)<br />
Data Soft (+/-)<br />
Data Legato (+/-)<br />
Data Hold2 (+/-)<br />
Data Varia<br />
Data Timbre<br />
Data Release<br />
Data Attack<br />
Data Bright<br />
Data SndCtrl 6<br />
Data SndCtrl 7<br />
Data SndCtrl 8<br />
Data SndCtrl 9<br />
Data SndCtrl 10<br />
Data But1 (+/-)<br />
Data But2 (+/-)<br />
Data But3 (+/-)<br />
Data But4 (+/-)<br />
Data ,,,,,,<br />
Data Fx Lev<br />
Data Tremu<br />
Data Chorus<br />
Data Celeste<br />
Data Phaser<br />
Data Data But+<br />
Data Data But-<br />
Data NonPar (fin)<br />
Data NonPar (crs)<br />
Data RegPar (fin)<br />
Data RegPar (crs)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data AllSnds-<br />
Data AllCtrls-<br />
Data Loc Kbrd (+/-)<br />
Data AllNotes-<br />
Data Omni-<br />
Data Omni+<br />
Data MonoOper<br />
Data PolyOper<br />
<br />
Local ls As String<br />
<br />
 ls = Read&#36;(cn + 1)<br />
 Function = IIf&#36;(Len(ls), ls, "(Unk)")<br />
<br />
End Function 'GetControllerName<br />
<br />
#Else 'verbose string functions<br />
<br />
'**************************************<br />
'returns the GM drum sound for note number "nn"<br />
Function GetGMDrumSound(nn As Long) As String<br />
<br />
'These are numbered beginning at 35<br />
Data Acoustic Bass Drum<br />
Data Bass Drum 1<br />
Data Side Stick<br />
Data Acoustic Snare<br />
Data Hand Clap<br />
Data Electric Snare<br />
Data Low Floor Tom<br />
Data Closed Hi-Hat<br />
Data High Floor Tom<br />
Data Pedal Hi-Hat<br />
Data Low Tom<br />
Data Open Hi-Hat<br />
Data Low-Mid Tom<br />
Data Hi-Mid Tom<br />
Data Crash Cymbal 1<br />
Data High Tom<br />
Data Ride Cymbal 1<br />
Data Chinese Cymbal<br />
Data Ride Bell<br />
Data Tambourine<br />
Data Splash Cymbal<br />
Data Cowbell<br />
Data Crash Cymbal 2<br />
Data Vibraslap<br />
Data Ride Cymbal 2<br />
Data Hi Bongo<br />
Data Low Bongo<br />
Data Mute Hi Conga<br />
Data Open Hi Conga<br />
Data Low Conga<br />
Data High Timbale<br />
Data Low Timbale<br />
Data High Agogo<br />
Data Low Agogo<br />
Data Cabasa<br />
Data Maracas<br />
Data Short Whistle<br />
Data Long Whistle<br />
Data Short Guiro<br />
Data Long Guiro<br />
Data Claves<br />
Data Hi Wood Block<br />
Data Low Wood Block<br />
Data Mute Cuica<br />
Data Open Cuica<br />
Data Mute Triangle<br />
Data Open Triangle<br />
<br />
 Function = Read&#36;(nn - 34)<br />
<br />
End Function 'GetGMDrumSound<br />
<br />
'**************************************<br />
'get verbose controller name<br />
'cn is a zero-based controller number<br />
Function GetControllerName(cn As Long) As String<br />
<br />
'Defined Controllers<br />
Data Bank Select<br />
Data Modulation Wheel (coarse)<br />
Data Breath controller (coarse)<br />
Data<br />
Data Foot Pedal (coarse)<br />
Data Portamento Time (coarse)<br />
Data Data Entry (coarse)<br />
Data Volume (coarse)<br />
Data Balance (coarse)<br />
Data<br />
Data Pan position (coarse)<br />
Data Expression (coarse)<br />
Data Effect Control 1 (coarse)<br />
Data Effect Control 2 (coarse)<br />
Data ,<br />
Data General Purpose Slider 1<br />
Data General Purpose Slider 2<br />
Data General Purpose Slider 3<br />
Data General Purpose Slider 4<br />
Data ,,,,,,,,,,,<br />
Data Bank Select (fine)<br />
Data Modulation Wheel (fine)<br />
Data Breath controller (fine)<br />
Data<br />
Data Foot Pedal (fine)<br />
Data Portamento Time (fine)<br />
Data Data Entry (fine)<br />
Data Volume (fine)<br />
Data Balance (fine)<br />
Data<br />
Data Pan position (fine)<br />
Data Expression (fine)<br />
Data Effect Control 1 (fine)<br />
Data Effect Control 2 (fine)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data Hold Pedal (on/off)<br />
Data Portamento (on/off)<br />
Data Sustenuto Pedal (on/off)<br />
Data Soft Pedal (on/off)<br />
Data Legato Pedal (on/off)<br />
Data Hold 2 Pedal (on/off)<br />
Data Sound Variation<br />
Data Sound Timbre<br />
Data Sound Release Time<br />
Data Sound Attack Time<br />
Data Sound Brightness<br />
Data Sound Control 6<br />
Data Sound Control 7<br />
Data Sound Control 8<br />
Data Sound Control 9<br />
Data Sound Control 10<br />
Data General Purpose Button 1 (on/off)<br />
Data General Purpose Button 2 (on/off)<br />
Data General Purpose Button 3 (on/off)<br />
Data General Purpose Button 4 (on/off)<br />
Data ,,,,,,<br />
Data Effects Level<br />
Data Tremulo Level<br />
Data Chorus Level<br />
Data Celeste Level<br />
Data Phaser Level<br />
Data Data Button increment<br />
Data Data Button decrement<br />
Data Non-registered Parameter (fine)<br />
Data Non-registered Parameter (coarse)<br />
Data Registered Parameter (fine)<br />
Data Registered Parameter (coarse)<br />
Data ,,,,,,,,,,,,,,,,,<br />
Data All Sound Off<br />
Data All Controllers Off<br />
Data Local Keyboard (on/off)<br />
Data All Notes Off<br />
Data Omni Mode Off<br />
Data Omni Mode On<br />
Data Mono Operation<br />
Data Poly Operation<br />
<br />
Local ls As String<br />
<br />
 ls = Read&#36;(cn + 1)<br />
 Function = IIf&#36;(Len(ls), ls, "(Unk)")<br />
<br />
End Function 'GetControllerName<br />
<br />
#EndIf<br />
<br />
'**************************************<br />
'pn is the zero-based patch index<br />
Function GetPatchName(pn As Long) As String<br />
<br />
'----------------------------------<br />
'Piano<br />
Data Acoustic Grand<br />
Data Bright Acoustic<br />
Data Electric Grand<br />
Data ***** - Tonk<br />
Data Electric Piano 1<br />
Data Electric Piano 2<br />
Data Harpsichord<br />
Data Clav<br />
<br />
'----------------------------------<br />
'Chromatic Percussion<br />
Data Celesta<br />
Data Glockenspiel<br />
Data Music Box<br />
Data Vibraphone<br />
Data Marimba<br />
Data Xylophone<br />
Data Tubular Bells<br />
Data Dulcimer<br />
<br />
'----------------------------------<br />
'Organ<br />
Data Drawbar Organ<br />
Data Percussive Organ<br />
Data Rock Organ<br />
Data Church Organ<br />
Data Reed Organ<br />
Data Accoridan<br />
Data Harmonica<br />
Data Tango Accordian<br />
<br />
'----------------------------------<br />
'Guitar<br />
Data Acoustic Guitar(nylon)<br />
Data Acoustic Guitar(steel)<br />
Data Electric Guitar(jazz)<br />
Data Electric Guitar(clean)<br />
Data Electric Guitar(muted)<br />
Data Overdriven Guitar<br />
Data Distortion Guitar<br />
Data Guitar Harmonics<br />
<br />
'----------------------------------<br />
'Bass<br />
Data Acoustic Bass<br />
Data Electric Bass(finger)<br />
Data Electric Bass(pick)<br />
Data Fretless Bass<br />
Data Slap Bass 1<br />
Data Slap Bass 2<br />
Data Synth Bass 1<br />
Data Synth Bass 2<br />
<br />
'----------------------------------<br />
'Solo Strings<br />
Data Violin<br />
Data Viola<br />
Data Cello<br />
Data Contrabass<br />
Data Tremolo Strings<br />
Data Pizzicato Strings<br />
Data Orchestral Strings<br />
Data Timpani<br />
<br />
'----------------------------------<br />
'Ensemble<br />
Data String Ensemble 1<br />
Data String Ensemble 2<br />
Data SynthStrings 1<br />
Data SynthStrings 2<br />
Data Choir Aahs<br />
Data Voice Oohs<br />
Data Synth Voice<br />
Data Orchestra Hit<br />
<br />
'----------------------------------<br />
'Brass<br />
Data Trumpet<br />
Data Trombone<br />
Data Tuba<br />
Data Muted Trumpet<br />
Data French Horn<br />
Data Brass Section<br />
Data SynthBrass 1<br />
Data SynthBrass 2<br />
<br />
'----------------------------------<br />
'Reed<br />
Data Soprano Sax<br />
Data Sax<br />
Data Tenor Sax<br />
Data Baritone Sax<br />
Data Oboe<br />
Data English Horn<br />
Data Bassoon<br />
Data Clarinet<br />
<br />
'----------------------------------<br />
'Pipe<br />
Data Piccolo<br />
Data Flute<br />
Data Recorder<br />
Data Pan Flute<br />
Data Blown Bottle<br />
Data Skakuhachi<br />
Data Whistle<br />
Data Ocarina<br />
<br />
'----------------------------------<br />
'Synth Lead<br />
Data Lead 1 (square)<br />
Data Lead 2 (sawtooth)<br />
Data Lead 3 (calliope)<br />
Data Lead 4 (chiff)<br />
Data Lead 5 (charang)<br />
Data Lead 6 (voice)<br />
Data Lead 7 (fifths)<br />
Data Lead 8 (bass + lead)<br />
<br />
'----------------------------------<br />
'Synth Pad<br />
Data Pad 1 (new age)<br />
Data Pad 2 (warm)<br />
Data Pad 3 (polysynth)<br />
Data Pad 4 (choir)<br />
Data Pad 5 (bowed)<br />
Data Pad 6 (metallic)<br />
Data Pad 7 (halo)<br />
Data Pad 8 (sweep)<br />
<br />
'----------------------------------<br />
'Synth Effects<br />
Data FX 1 (rain)<br />
Data FX 2 (soundtrack)<br />
Data FX 3 (crystal)<br />
Data FX 4 (atmosphere)<br />
Data FX 5 (brightness)<br />
Data FX 6 (goblins)<br />
Data FX 7 (echoes)<br />
Data FX 8 (sci-fi)<br />
<br />
'----------------------------------<br />
'Ethnic<br />
Data Sitar<br />
Data Banjo<br />
Data Shamisen<br />
Data Koto<br />
Data Kalimba<br />
Data Bagpipe<br />
Data Fiddle<br />
Data Shanai<br />
<br />
'----------------------------------<br />
'Percussive<br />
Data Tinkle Bell<br />
Data Agogo<br />
Data Steel Drums<br />
Data Woodblock<br />
Data Taiko Drum<br />
Data Melodic Tom<br />
Data Synth Drum<br />
Data Reverse Cymbal<br />
<br />
'----------------------------------<br />
'Sound Effects<br />
Data Guitar Fret Noise<br />
Data Breath Noise<br />
Data Seashore<br />
Data Bird Tweet<br />
Data Telephone Ring<br />
Data Helicopter<br />
Data Applause<br />
Data Gunshot<br />
<br />
 Function = Read&#36;(pn + 1)<br />
<br />
End Function 'GetPatchName<br />
<br />
'**************************************<br />
'for SysEx events<br />
'mn is a one-based, manufacturer's ID number<br />
'(not sure how up to date the list is)<br />
Function GetManufacturerName(mn As Long) As String<br />
<br />
'Here are the Manufacturer which have ID numbers assigned:<br />
Data Sequential Circuits<br />
Data Big Briar<br />
Data Octave / Plateau<br />
Data Moog 4<br />
Data Passport Designs<br />
Data Lexicon<br />
Data Kurzweil<br />
Data Fender<br />
Data Gulbransen<br />
Data Delta Labs<br />
Data Sound Comp.<br />
Data General Electro<br />
Data Techmar<br />
Data Matthews Research<br />
Data<br />
<br />
Data Oberheim<br />
Data PAIA<br />
Data Simmons<br />
Data DigiDesign<br />
Data Fairlight<br />
Data JL Cooper<br />
Data Lowery<br />
Data Lin<br />
Data Emu<br />
Data ,<br />
Data Peavey<br />
Data ,,,<br />
<br />
Data Bon Tempi<br />
Data S.I.E.L.<br />
Data<br />
Data SyntheAxe<br />
Data Hohner<br />
Data Crumar<br />
Data Solton<br />
Data Jellinghaus Ms<br />
Data CTS<br />
Data PPG<br />
Data ,,,,<br />
Data Elka<br />
<br />
Data ,,,,,<br />
Data Cheetah<br />
Data ,,,,,,<br />
Data Waldorf<br />
Data<br />
<br />
Data Kawai<br />
Data Roland<br />
Data Korg<br />
Data Yamaha<br />
Data Casio<br />
Data Akai<br />
<br />
Local ls As String<br />
<br />
 Select Case mn<br />
 Case &lt; &amp;H46 : ls = Read&#36;(mn)<br />
 Case = &amp;H7E : ls = "Non-RealTime (universal)"<br />
 Case = &amp;H7F : ls = "RealTime (universal)"<br />
 End Select<br />
<br />
 Function = IIf&#36;(Len(ls), ls, "(Unk)")<br />
<br />
End Function 'GetManufacturerName<br />
<br />
'**************************************<br />
'returns a variable-length data value<br />
'this modifies p to point it at the last byte of<br />
'variable-length data<br />
Function VarLen(tk As String, ByRef p As Long) As Long<br />
Local b As Long<br />
Local n As Long<br />
Local td As Dword<br />
<br />
 Do<br />
 Incr n<br />
 b = Asc(tk, p)<br />
 Shift Left td, 7<br />
 td = td + (b And 127)<br />
 If (b And &amp;H80) = 0 Then Exit Do<br />
 Incr p<br />
<br />
 Loop While (n &lt; 5) And (p &lt;= Len(tk))<br />
<br />
 Function = td<br />
<br />
End Function<br />
<br />
'**************************************<br />
'Octave| | Note Numbers<br />
' # | |<br />
' | | C | C# | D | D# | E | F | F# | G | G# | A | A# | B<br />
'-----------------------------------------------------------------------------<br />
' 0 | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11<br />
' 1 | | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23<br />
' 2 | | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35<br />
' 3 | | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47<br />
' 4 | | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59<br />
' 5 | | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71<br />
' 6 | | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83<br />
' 7 | | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95<br />
' 8 | | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107<br />
' 9 | | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119<br />
' 10 | | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 |<br />
<br />
Function GetNoteName(nn As Long) As String<br />
 Function = Parse&#36;(&#36;Notes, (nn Mod 12) + 1) &amp; " (" &amp; Format&#36;(nn&#92;12) &amp; ")"<br />
End Function 'GetNoteName<br />
<br />
'**************************************<br />
'returns a string to display the total<br />
'delta-time ticks elapsed since the start of<br />
'the current track<br />
'resets the time if dt = &amp;HFFFFFFFF???<br />
Function FormatTime(dt As Dword) As String<br />
Static tm As Quad<br />
<br />
 If dt = &amp;HFFFFFFFF??? Then tm = 0 : Exit Function 'reset the time<br />
 tm = tm + dt 'update the time<br />
<br />
 Function = Using&#36;("#,", tm)<br />
<br />
End Function 'FormatTime<br />
<br />
'**************************************<br />
'p must arrive pointing at the meta-event's code<br />
Function DisMetaEvent(tk As String, ByVal p As Long, ByVal dt As Dword) As Long<br />
Local ev As Long 'event code<br />
Local n As Long<br />
Local pf As Long '"Print#" flag<br />
Local x As Long<br />
Local ls As String<br />
Local ts As String<br />
Local td As Dword 'temporary DWord<br />
<br />
<br />
 Dim ab(3) As Byte At VarPtr(td)<br />
<br />
 'get the event code and channel number<br />
 ev = Asc(tk, p)<br />
<br />
 Incr p<br />
 n = VarLen(tk, p)<br />
<br />
 'get the event's data<br />
 Incr p<br />
 ls = Mid&#36;(tk, p, n)<br />
<br />
 Incr pf 'enable Print#-ing<br />
<br />
 '----------------------------------<br />
 'decode the event<br />
 Select Case ev<br />
<br />
 ' Set Track Sequence Number<br />
 Case &amp;H00<br />
 td = CvWrd(ls)<br />
 Swap ab(0), ab(1)<br />
 ls = "Sequence= " &amp; Format&#36;(td)<br />
<br />
 ' Text<br />
 Case &amp;H01<br />
 ls = "Text {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Copyright Info<br />
 Case &amp;H02<br />
 ls = "CopyRight {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Sequence or Track Name<br />
 Case &amp;H03<br />
 ls = "TrackName {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Track Instrument Name<br />
 Case &amp;H04<br />
 ls = "Instrument {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Lyric<br />
 Case &amp;H05<br />
 ls = "Lyric {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Marker<br />
 Case &amp;H06<br />
 ls = "Marker {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' Cue Point<br />
 Case &amp;H07<br />
 ls = "CuePoint {" &amp; &#36;Lf &amp; ls &amp; "}"<br />
<br />
 ' MIDI Channel<br />
 Case &amp;H07<br />
 ls = "MidiChannel= " &amp; Format&#36;(Asc(ls) + 1)<br />
<br />
 ' Device Name Assigned to MIDI Port<br />
 Case &amp;H21<br />
 x = Asc(ls)<br />
 ls = "Error getting device name:" &amp; &#36;CrLf<br />
 Select Case midiOutGetDevCaps(x, moc, SizeOf(MIDIOUTCAPS))<br />
 Case %MMSYSERR_BADDEVICEID<br />
 ls = ls &amp; """The specified device identifier is out of range."""<br />
 Case %MMSYSERR_INVALPARAM<br />
 ls = ls &amp; """The specified pointer or structure is invalid."""<br />
 Case %MMSYSERR_NODRIVER<br />
 ls = ls &amp; """The driver is not installed."""<br />
 Case %MMSYSERR_NOMEM<br />
 ls = ls &amp; """The system is unable to load mapper string description."""<br />
 Case %MMSYSERR_NOERROR<br />
 ls = "DeviceName= " &amp; moc.szPname<br />
 End Select<br />
<br />
 ' End of Track<br />
 Case &amp;H2F<br />
 ls = "EndOfTrack"<br />
<br />
 ' Set Tempo<br />
 Case &amp;H51<br />
 td = CvDwd(ls)<br />
 GoSub ToggleEndian<br />
 Shift Right td, 8<br />
 tmpo = 60000000/td<br />
 ls = "Tempo=" &amp; Format&#36;(tmpo) &amp; " (" &amp; Format&#36;(td) &amp; " mms per 1/4 note)"<br />
<br />
 ' SMPTE Offset<br />
 Case &amp;H54 '(not implemented)<br />
<br />
 ' Time Signature<br />
 Case &amp;H58<br />
 ts = ls<br />
 ls = "TimeSignature {" &amp; &#36;Lf<br />
 ls = ls &amp; Format&#36;(Asc(ts, 1)) &amp; "/" &amp; Format&#36;(2 ^ Asc(ts, 2)) &amp; &#36;Lf<br />
 ls = ls &amp; "Ticks/metronome click= " &amp; Format&#36;(Asc(ts, 3)) &amp; &#36;Lf<br />
 ls = ls &amp; "32nd notes/quarter= " &amp; Format&#36;(Asc(ts, 4)) &amp; &#36;Lf &amp; "}"<br />
<br />
 ' Key Signature<br />
 Case &amp;H59<br />
 x = Asc(ls, 1)<br />
 If Bit(x, 7) Then x = x Or &amp;HFFFFFF00<br />
<br />
 If x &lt;&gt; 0 Then<br />
 ts = String&#36;(Abs(x), IIf&#36;(x &gt; 0, "#", "b")) &amp; IIf&#36;(Asc(ls, 2), " Min", " Maj")<br />
 Else<br />
 ts = "(Nat)"<br />
 End If<br />
<br />
 ls = "KeySignature: " &amp; ts<br />
<br />
 ' Proprietary (sequencer-specific information)<br />
 Case &amp;H7F<br />
 ts = ls<br />
 ls = "Proprietary {" &amp; &#36;Lf<br />
 ls = ls &amp; "Program ID: " &amp; Left&#36;(ts, Min(4, Verify(ts, &#36;Ascii) - 1)) &amp; &#36;Lf<br />
<br />
 For x = 1 To Len(ts)<br />
 ls = ls &amp; Hex&#36;(Asc(ts, x), 2) &amp; &#36;Spc<br />
 If x Mod 16 = 0 Then ls = ls &amp; &#36;Lf<br />
 Next x<br />
<br />
 ls = ls &amp; "}"<br />
<br />
 Case Else<br />
 ls = "UnkownMetaEvent: &amp;H" &amp; Hex&#36;(ev, 2)<br />
<br />
 End Select<br />
<br />
 If pf Then<br />
 Replace &#36;Lf With &#36;CrLf In ls<br />
 Print# fo, FormatTime(dt) &amp; &#36;Tab &amp; &#36;EventPrefix &amp; ls<br />
 End If<br />
<br />
 Function = p + n - 1<br />
<br />
 Exit Function<br />
<br />
ToggleEndian:<br />
 Swap ab(0), ab(3)<br />
 Swap ab(1), ab(2)<br />
Return<br />
<br />
End Function 'DisMetaEvent<br />
<br />
'**************************************<br />
<br />
Function DisTrack(tk As String) As Long<br />
Local ev As Long<br />
Local dt As Dword 'delta time<br />
Local ch As Long 'channel<br />
<br />
Local cn As Long 'controller number<br />
Local nn As Long 'note number<br />
Local ve As Long 'velocity<br />
Local pn As Long 'patch number<br />
<br />
Local pw As Long 'pitch wheel<br />
Local nv As Long '"new value"<br />
<br />
Local pf As Long '"Print#" flag<br />
Local wf As Long 'warning flag<br />
<br />
Local n As Long<br />
Local p As Long<br />
Local tc As String 'time and channel<br />
Local ls As String<br />
Local ts As String<br />
<br />
<br />
 For p = 1 To Len(tk)<br />
<br />
 dt = VarLen(tk, p) 'get the delta-time<br />
<br />
 Incr p<br />
 n = Asc(tk, p)<br />
<br />
 'if no event byte is present, the last one is assumed to be intended<br />
 If (n And 128) Then<br />
 ev = n<br />
 Incr p<br />
 End If<br />
<br />
 ch = (ev And 15) + 1<br />
 ls = FormatTime(dt) &amp; &#36;Tab &amp; "Ch=" &amp; Format&#36;(ch) &amp; ": " &amp; &#36;EventPrefix<br />
<br />
 Incr pf 'enable Print#-ing<br />
<br />
 '----------------------------------<br />
 'decode the event<br />
 Select Case ev<br />
<br />
 'just in case...<br />
 Case &lt; &amp;H80<br />
 ls = "Running Mode Error!"<br />
<br />
 ' Note Off<br />
 Case &lt; &amp;H90<br />
 nn = Asc(tk, p)<br />
 Incr p<br />
 ve = Asc(tk, p)<br />
 ls = Left&#36;(ls, Len(ls) - 1) &amp; " - " &amp; IIf&#36;(ch = 10, GetGMDrumSound(nn), GetNoteName(nn)) &amp; &#36;Tab &amp; "V=" &amp; Format&#36;(ve)<br />
<br />
 ' Note On<br />
 Case &lt; &amp;HA0<br />
 nn = Asc(tk, p)<br />
 Incr p<br />
 ve = Asc(tk, p)<br />
 ls = Left&#36;(ls, Len(ls) - 1) &amp; IIf&#36;(ve, "+ ", "z ") &amp; IIf&#36;(ch = 10, GetGMDrumSound(nn), GetNoteName(nn))<br />
 ls = ls &amp; IIf&#36;(ve, &#36;Tab &amp; "V=" &amp; Format&#36;(ve), "")<br />
<br />
 ' Key After-Touch<br />
 Case &lt; &amp;HB0<br />
 nn = Asc(tk, p)<br />
 Incr p<br />
 ve = Asc(tk, p)<br />
 ls = ls &amp; "Touch:" &amp; &#36;Tab &amp; IIf&#36;(ch = 10, GetGMDrumSound(nn), GetNoteName(nn)) &amp; &#36;Tab &amp; "V=" &amp; Format&#36;(ve)<br />
<br />
 ' Control Change<br />
 Case &lt; &amp;HC0<br />
 cn = Asc(tk, p)<br />
 Incr p<br />
 nv = Asc(tk, p)<br />
 ls = ls &amp; "Ctrl:" &amp; GetControllerName(cn) &amp; "=" &amp; Format&#36;(nv)<br />
<br />
 ' Program (Patch) Change<br />
 Case &lt; &amp;HD0<br />
 pn = Asc(tk, p)<br />
 ls = ls &amp; "Patch= " &amp; GetPatchName(pn)<br />
<br />
 ' Channel Pressure<br />
 Case &lt; &amp;HE0<br />
 cn = Asc(tk, p)<br />
 ls = ls &amp; "ChanPress=" &amp; Format&#36;(cn)<br />
<br />
 ' Pitch Wheel Change<br />
 Case &lt; &amp;HF0<br />
 pw = Asc(tk, p) And 127<br />
 Incr p<br />
 pw = pw + ((Asc(tk, p) And 127) * 128)<br />
 ls = ls &amp; "Wheel= " &amp; Format&#36;(pw - &amp;H2000&amp;)<br />
<br />
 ' System Exclusive<br />
 Case &amp;HF0<br />
<br />
 ls = FormatTime(dt) &amp; &#36;Tab &amp; &#36;EventPrefix &amp; "SysEx: (hex format) {" &amp; &#36;CrLf<br />
<br />
 n = p + VarLen(tk, p)<br />
 ls = ls &amp; "Manufacturer: " &amp; GetManufacturerName(Asc(tk, p)) &amp; &#36;CrLf<br />
 Do While p &lt; n<br />
 Incr p<br />
 ls = ls &amp; &#36;Spc &amp; Hex&#36;(Asc(tk, p), 2)<br />
 If (n - p) Mod 16 = 0 Then ls = ls &amp; &#36;CrLf<br />
 Loop<br />
<br />
 ls = ls &amp; "}"<br />
<br />
 'Song Position (not implemented)<br />
 Case &amp;HF2<br />
 Incr wf<br />
 ls = ls &amp; "SongPosition"<br />
<br />
 'Song Select (not implemented)<br />
 Case &amp;HF3<br />
 Incr wf<br />
 ls = ls &amp; "SongSelect"<br />
<br />
 'Unofficial Bus Select (not implemented)<br />
 Case &amp;HF5<br />
 Incr wf<br />
 ls = ls &amp; "UnofficialBusSelect"<br />
<br />
 'Tune Request (not implemented)<br />
 Case &amp;HF6<br />
 Incr wf<br />
 ls = ls &amp; "TuneRequest"<br />
<br />
 'End of SysEx<br />
 'Case &amp;HF7<br />
 'this should always be caught in a SysEx event, so it's REM-ed out<br />
 ' Incr wf<br />
 ' ls = "}"<br />
<br />
 'Timing Tick (not implemented)<br />
 Case &amp;HF8<br />
 Incr wf<br />
 ls = ls &amp; "TimingTick"<br />
<br />
 'Start Current Sequence (not implemented)<br />
 Case &amp;HFA<br />
 Incr wf<br />
 ls = ls &amp; "StartCurrentSeq"<br />
<br />
 'Continue Stopped Sequence (not implemented)<br />
 Case &amp;HFB<br />
 Incr wf<br />
 ls = ls &amp; "ContinueSeq"<br />
<br />
 'Stop Sequence (not implemented)<br />
 Case &amp;HFC<br />
 Incr wf<br />
 ls = ls &amp; "StopSeq"<br />
<br />
 'Active Sensing (not implemented)<br />
 Case &amp;HFE<br />
 Incr wf<br />
 ls = ls &amp; "ActiveSensing"<br />
<br />
 'Meta-Event<br />
 Case &amp;HFF<br />
 p = DisMetaEvent(tk, p, dt)<br />
 pf = 0<br />
<br />
 End Select<br />
<br />
 If pf Then Print# fo, ls<br />
 If wf Then<br />
 gs = "Found an unimplemented command, aborting track..."<br />
 Msg gs<br />
 Print# fo, gs<br />
 Exit Function<br />
 End If<br />
<br />
 Next p<br />
<br />
End Function<br />
<br />
'**************************************<br />
'if dr &lt;&gt; 0 then the file was dropped on to the<br />
'dialog rather than dropped on the icon or entered<br />
'at the command line.<br />
Function MidiMain(dr As Long) As Long<br />
Local fi As Long 'input file<br />
Local n As Long<br />
Local trks As Long 'number of tracks<br />
Local tn As Long 'track number<br />
Local tlen As Long 'track length<br />
Local td As Dword 'temporary DWord<br />
Local ls As String<br />
Local tk As String<br />
<br />
 Dim ab(3) As Byte At VarPtr(td)<br />
<br />
 If dr = 0 Then<br />
 If InStr(",H,HELP,-H,-HELP,/H,/HELP,", "," &amp; UCase&#36;(InFile) &amp; ",") Then<br />
 MsgBox &#36;Help, %mb_iconinformation, &#36;Caption<br />
 Exit Function<br />
 End If<br />
 End If<br />
<br />
<br />
 'add file extension if needed<br />
 If InStr(InFile, ".") = 0 Then<br />
 InFile = InFile &amp; ".MID"<br />
 ElseIf UCase&#36;(Right&#36;(InFile, 4)) &lt;&gt; ".MID" Then 'check file extension<br />
 gs = "Error:" &amp; &#36;CrLf &amp; "Incorrect file extension. It must be a "".MID"" file"<br />
 If dr Then Msg gs Else MsgBox gs, %mb_iconerror, &#36;Caption<br />
 Exit Function<br />
 End If<br />
<br />
<br />
 If Len(Dir&#36;(InFile)) = 0 Then<br />
 gs = "Error: Couldn't find " &amp; &#36;CrLf &amp; """" &amp; InFile &amp; """"<br />
 If dr Then Msg gs Else MsgBox gs, %mb_iconerror, &#36;Caption<br />
 Exit Function<br />
 End If<br />
<br />
<br />
 OutFile = Left&#36;(InFile, Len(InFile) - 3) &amp; "txt"<br />
 If Len(Dir&#36;(OutFile)) Then<br />
 If MsgBox("Over-write:" &amp; &#36;CrLf &amp; OutFile &amp; "?", %mb_yesno, &#36;Caption) = %idno Then Exit Function<br />
 End If<br />
<br />
 '----------------------------------<br />
 fi = FreeFile<br />
 Open InFile For Binary As #fi<br />
<br />
 fo = FreeFile<br />
 Open OutFile For Output As #fo<br />
<br />
 '----------------------------------<br />
 Get&#36; #fi, 8, ls<br />
 If ls &lt;&gt; &#36;MidiHeader Then<br />
 gs = "Error: bad header"<br />
 If dr Then Msg gs Else MsgBox gs<br />
 Exit Function<br />
 End If<br />
<br />
<br />
 '----------------------------------<br />
 Get&#36; #fi, 2, ls 'get the track format<br />
 Print# fo, "Format= " &amp; Choose&#36;(Asc(ls, 2) + 1, _<br />
 "Single-Track", "Multi-Track, Synchronous", _<br />
 "Multi-Track, Asynchronous")<br />
<br />
 '----------------------------------<br />
 Get&#36; #fi, 2, ls 'get number of tracks<br />
 trks = (Asc(ls, 1) * 256) + Asc(ls, 2)<br />
 Print# fo, "Tracks=" &amp; Format&#36;(trks)<br />
<br />
<br />
 '-----------------------------------------------------------------------<br />
 tmpo = 120 'set the default BPM<br />
<br />
 Get&#36; #fi, 2, ls 'get the delta-time ticks per quarter note<br />
 div = Asc(ls, 1)<br />
 If Bit(div, 7) Then<br />
 !'Note: This might not give correct results for SMPTE !<br />
 sf = Abs(CLng(div Or &amp;HFFFFFF00???))<br />
 sr = Asc(ls, 2)<br />
 tpq = sf * sr * 1000000.0<br />
 ls = "SMPTE divisions per quarter-note= "<br />
<br />
 Else<br />
 tpq = (div * 256) + Asc(ls, 2)<br />
 ls = "Delta-time ticks per quarter note= "<br />
<br />
 End If<br />
<br />
 Print# fo, ls &amp; Format&#36;(tpq)<br />
<br />
<br />
 '----------------------------------<br />
 'Dump the tracks<br />
 Do<br />
<br />
 '----------------------------------<br />
 'get the track header<br />
 Get&#36; #fi, 4, ls<br />
 If ls &lt;&gt; "MTrk" Then Exit Do 'bad header<br />
<br />
 Print# fo,<br />
 Print# fo, "****************************************"<br />
<br />
 '----------------------------------<br />
 'get track's length in bytes<br />
 Get&#36; #fi, 4, ls<br />
 td = CvDwd(ls)<br />
 Swap ab(0), ab(3)<br />
 Swap ab(1), ab(2)<br />
 tlen = td<br />
<br />
 Print# fo, "Track=" &amp; Format&#36;(tn) &amp; &#36;Tab &amp; "Bytes=" &amp; Format&#36;(tlen)<br />
 Get&#36; #fi, tlen, tk 'get the track's contents<br />
<br />
 FormatTime(&amp;HFFFFFFFF???)<br />
<br />
 DisTrack(tk)<br />
<br />
 Incr tn 'next track number<br />
<br />
 Loop Until Eof(1)<br />
<br />
 Close# fi, #fo<br />
<br />
 gs = "Done with """ &amp; InFile &amp; """." &amp; &#36;CrLf &amp; "The output is in """ &amp; OutFile &amp; """"<br />
 If dr Then Msg gs Else MsgBox gs<br />
<br />
End Function 'MidiMain<br />
<br />
'**************************************<br />
<br />
CallBack Function ShowDlgProc()<br />
Local n As Long<br />
<br />
 Select Case As Long CbMsg<br />
<br />
 Case %wm_initdialog<br />
 Msg &#36;Help<br />
 DragAcceptFiles hDlg, %TRUE<br />
<br />
 Case %WM_DROPFILES<br />
 InFile = String&#36;(%MAX_PATH, &#36;Nul)<br />
 n = DragQueryFile(CbWParam, -1, ByVal 0, 0)<br />
 DragQueryFile CbWParam, 0, ByVal StrPtr(InFile), %MAX_PATH<br />
 DragFinish CbWParam<br />
 InFile = RTrim&#36;(InFile, &#36;Nul)<br />
 Msg "Processing: """ &amp; InFile &amp; """"<br />
 MidiMain 1<br />
<br />
 Case %wm_command<br />
 Select Case As Long CbCtl<br />
 Case %idcancel<br />
 Dialog End hDlg<br />
<br />
 End Select<br />
<br />
 End Select<br />
<br />
End Function<br />
<br />
'**************************************<br />
<br />
Function PBMain() As Long<br />
 Local lRslt As Long<br />
<br />
 InFile = Trim&#36;(Command&#36;, Any " """)<br />
 If Len(InFile) Then<br />
 MidiMain 0<br />
 Exit Function<br />
 End If<br />
<br />
 Dialog New %HWND_DESKTOP, &#36;Caption, 286, 65, 189, 65, _<br />
 %ws_popup Or %ws_border Or %ws_dlgframe Or %ws_caption Or _<br />
 %ws_sysmenu Or %ws_minimizebox Or %ws_clipsiblings Or %ws_visible Or _<br />
 %ds_modalframe Or %ds_3dlook Or %ds_nofailcreate Or %ds_setfont, _<br />
 %ws_ex_acceptfiles Or %ws_ex_controlparent Or %ws_ex_left Or _<br />
 %ws_ex_ltrreading Or %ws_ex_rightscrollbar, To hDlg<br />
 Control Add Label, hDlg, %Lbl, "Drop "".MID"" files onto this window", _<br />
 0, 4, 188, 14, %ws_child Or %ws_visible Or %ss_center, %ws_ex_left Or _<br />
 %ws_ex_ltrreading<br />
 Control Add TextBox, hDlg, %Txt, "", 0, 19, 188, 45, %ws_child Or _<br />
 %ws_visible Or %ws_tabstop Or %es_left Or %es_multiline Or _<br />
 %es_autohscroll Or %es_autovscroll Or %es_readonly, _<br />
 %ws_ex_clientedge Or %ws_ex_left Or %ws_ex_ltrreading Or _<br />
 %ws_ex_rightscrollbar<br />
<br />
 Dialog Show Modal hDlg, Call ShowDlgProc To lRslt<br />
<br />
 DragAcceptFiles hdlg, %FALSE<br />
<br />
 Function = lRslt<br />
<br />
End Function<br />
<br />
'**************************************</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[نشان دادن ماژولهای مورد استفاده توسط پروسه ها]]></title>
			<link>https://www.iranled.com/forum/thread-11774.html</link>
			<pubDate>Fri, 20 Feb 2009 05:22:57 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11774.html</guid>
			<description><![CDATA[این کد ماژولهای هر پروسه ای رو همراه با ورژن اون نشون می ده :<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe<br />
 #Dim All<br />
 #Register None<br />
 #Include "Win32Api.Inc"<br />
<br />
 Global hDlg As Long, hFont As Dword<br />
<br />
<br />
 %TH32CS_SNAPPROCESS = &amp;H2&amp; ' dwFlags for<br />
 %TH32CS_SNAPMODULE = &amp;H8&amp; ' CreateToolhelp32Snapshot<br />
<br />
 %MAX_MODULE_NAME32 = 255<br />
<br />
 Type PROCESSENTRY32<br />
 dwSize As Dword<br />
 cntUsage As Dword<br />
 th32ProcessID As Dword ' This process<br />
 th32DefaultHeapID As Long Ptr<br />
 th32ModuleID As Dword ' Associated exe<br />
 cntThreads As Dword<br />
 th32ParentProcessID As Dword ' This process's parent process<br />
 pcPriClassBase As Long ' Base priority of process threads<br />
 dwFlags As Dword<br />
 szExeFile As Asciiz * %MAX_PATH ' Path<br />
 End Type<br />
<br />
 Type MODULEENTRY32<br />
 dwSize As Dword<br />
 th32ModuleID As Dword ' This module<br />
 th32ProcessID As Dword ' Owning process<br />
 GlblcntUsage As Dword ' Global usage count on the module<br />
 ProccntUsage As Dword ' Module usage count in th32ProcessID's context<br />
 modBaseAddr As Byte Ptr ' Base address of module in th32ProcessID's context<br />
 modBaseSize As Dword ' Size in bytes of module starting at modBaseAddr<br />
 hModule As Dword ' The hModule of this module in th32ProcessID's context<br />
 szModule As Asciiz * (%MAX_MODULE_NAME32 + 1)<br />
 szExePath As Asciiz * %MAX_PATH<br />
 End Type<br />
<br />
<br />
 Declare Function CreateToolhelp32Snapshot (ByVal dwFlags As Dword, ByVal th32ProcessID As Dword) As Long<br />
 Declare Function Process32First (ByVal hSnapshot As Dword, pe As PROCESSENTRY32) As Long<br />
 Declare Function Process32Next (ByVal hSnapshot As Dword, pe As PROCESSENTRY32) As Long<br />
 Declare Function Module32First (ByVal hSnapshot As Dword, Me As MODULEENTRY32) As Long<br />
 Declare Function Module32Next (ByVal hSnapshot As Dword, Me As MODULEENTRY32) As Long<br />
 Declare Function EnumProcesses (idProcess As Dword, ByVal cb As Dword, cbNeeded As Dword) As Long<br />
 Declare Function GetModuleFileNameEx (ByVal hProcess As Dword, ByVal hModule As Dword, ModuleName As Asciiz, ByVal nSize As Dword) As Dword<br />
 Declare Function EnumProcessModules (ByVal hProcess As Dword, hModule As Dword, ByVal cb As Dword, cbNeeded As Dword) As Long<br />
 Declare Function GetVersionStringInfo (ByVal Fname As String) As String<br />
 Declare Function MakeFontEx(ByVal FontName As String, ByVal PointSize As Long, ByVal fBold As Long, _<br />
 ByVal fItalic As Long, ByVal fUnderline As Long) As Long<br />
<br />
 %ID_LISTBOX = 1001<br />
<br />
 Sub EnumModules<br />
 Dim hKernel32 As Local Dword<br />
 Dim hCreateToolhelp32Snapshot As Local Dword<br />
 Dim hProcess32Next As Local Dword<br />
 Dim hProcess32First As Local Dword<br />
 Dim hModule32First As Local Dword<br />
 Dim hModule32Next As Local Dword<br />
 Dim hPsApiDll As Local Dword<br />
 Dim hEnumProcesses As Local Dword<br />
 Dim hGetModuleFileNameEx As Local Dword<br />
 Dim hEnumProcessModules As Local Dword<br />
<br />
 Dim os As Local OSVERSIONINFO<br />
 Dim pe As Local PROCESSENTRY32<br />
 Dim mee As Local MODULEENTRY32<br />
 Dim hProcessSnap As Local Dword<br />
 Dim hModuleSnap As Local Dword<br />
 Dim nModules As Local Dword<br />
 Dim nProcesses As Local Dword<br />
 Dim hProcess As Local Dword<br />
 Dim lResult1 As Local Long<br />
 Dim lResult2 As Local Long<br />
 Dim cb As Local Dword<br />
 Dim cbNeeded As Local Dword<br />
 Dim i As Local Dword<br />
 Dim j As Local Dword<br />
<br />
 os.dwOSVersionInfoSize = SizeOf(os)<br />
 GetVersionEx ByVal VarPtr(os)<br />
 ListBox Reset hDlg, %ID_LISTBOX<br />
<br />
 If IsFalse(os.dwPlatformId = %VER_PLATFORM_WIN32_NT) Then ' Windows 95/98<br />
<br />
 hKernel32 = GetModuleHandle("kernel32.dll")<br />
 hCreateToolhelp32Snapshot = GetProcAddress(hKernel32, "CreateToolhelp32Snapshot")<br />
 hProcess32Next = GetProcAddress(hKernel32, "Process32Next")<br />
 hProcess32First = GetProcAddress(hKernel32, "Process32First")<br />
 hModule32First = GetProcAddress(hKernel32, "Module32First")<br />
 hModule32Next = GetProcAddress(hKernel32, "Module32Next")<br />
<br />
 Call Dword hCreateToolhelp32Snapshot Using CreateToolhelp32Snapshot (%TH32CS_SNAPPROCESS, 0&amp;) To hProcessSnap<br />
 If hProcessSnap &lt;&gt; %INVALID_HANDLE_VALUE Then<br />
 pe.dwSize = SizeOf(pe)<br />
 Call Dword hProcess32First Using Process32First (hProcessSnap, pe) To lResult1<br />
 While lResult1<br />
 ListBox Add hDlg, %ID_LISTBOX, pe.szExeFile<br />
<br />
 Call Dword hCreateToolhelp32Snapshot Using CreateToolhelp32Snapshot(%TH32CS_SNAPMODULE, pe.th32ProcessID) To hModuleSnap<br />
 If hModuleSnap &lt;&gt; %INVALID_HANDLE_VALUE Then<br />
 mee.dwSize = SizeOf(MODULEENTRY32)<br />
 Call Dword hModule32First Using Module32First (hModuleSnap, mee) To lResult2<br />
 While lResult2<br />
 If pe.th32ModuleID &lt;&gt; mee.th32ModuleID Then _<br />
 ListBox Add hDlg, %ID_LISTBOX, " " + _<br />
 LSet&#36;(GetVersionStringInfo(mee.szExePath),16) + mee.szExePath<br />
 Call Dword hModule32Next Using Module32Next (hModuleSnap, mee) To lResult2<br />
 Wend<br />
 CloseHandle hModuleSnap<br />
 ListBox Add hDlg, %ID_LISTBOX, "--------------------------------"<br />
 End If<br />
 Call Dword hProcess32Next Using Process32Next (hProcessSnap, pe) To Lresult1<br />
 Wend<br />
 CloseHandle hProcessSnap<br />
 End If<br />
<br />
 Else ' Windows NT<br />
 hPsApiDll = GetModuleHandle("psApi.dll"): If hPsApiDll = 0 Then hPsApiDll = LoadLibrary("psApi.dll")<br />
 hEnumProcesses = GetProcAddress(hPsApiDll, "EnumProcesses")<br />
 hGetModuleFileNameEx = GetProcAddress(hPsApiDll, "GetModuleFileNameExA")<br />
 hEnumProcessModules = GetProcAddress(hPsApiDll, "EnumProcessModules")<br />
<br />
 cb = 100<br />
 Do<br />
 ReDim ProcessIDs(1 To cb &#92; 4) As Dword<br />
 Call Dword hEnumProcesses Using EnumProcesses (ProcessIDs(1), cb, cbNeeded) To lResult1<br />
 If cb &gt; cbNeeded Then Exit Do<br />
 cb = cb + cb<br />
 Loop<br />
 nProcesses = cbNeeded &#92; 4<br />
<br />
 For i = 1 To nProcesses<br />
 hProcess = OpenProcess(%PROCESS_QUERY_INFORMATION Or %PROCESS_VM_READ, %False, ProcessIDs(i))<br />
 If hProcess Then<br />
 cb = 100<br />
 Do<br />
 ReDim Modules(1 To cb / 4) As Dword<br />
 Call Dword hEnumProcessModules Using EnumProcessModules (hProcess, Modules(1), cb, cbNeeded) To lResult1<br />
 If lResult1 = 0 Then cbNeeded = 0: Exit Do<br />
 If cb &gt; cbNeeded Then Exit Do Else cb = cb * 2<br />
 Loop<br />
 nModules = cbNeeded / 4<br />
 For j = 1 To nModules<br />
 Call Dword hGetModuleFileNameEx Using GetModuleFileNameEx (hProcess, Modules(j), pe.szExeFile, SizeOf(pe.szExeFile)) To lResult1<br />
 If lResult1 Then If j = 1 Then ListBox Add hDlg, %ID_LISTBOX, pe.szExeFile Else _<br />
 ListBox Add hDlg, %ID_LISTBOX, " " + _<br />
 LSet&#36;(GetVersionStringInfo(pe.szExeFile),16)+ _<br />
 pe.szExeFile<br />
 Next<br />
 CloseHandle hProcess<br />
 ListBox Add hDlg, %ID_LISTBOX, "--------------------------------"<br />
 End If<br />
 Next<br />
 End If<br />
 End Sub<br />
<br />
 CallBack Function DlgProc<br />
 Select Case CbMsg<br />
 Case %wm_initdialog<br />
 Control Add ListBox, CbHndl, %ID_LISTBOX, , 0, 0, 0, 0, %ws_child Or %ws_vscroll, %ws_ex_clientedge<br />
 hFont = MakeFontEx("System", 10,%FW_LIGHT, 0, 0) 'create desired font<br />
 Control Send CbHndl, %ID_LISTBOX, %WM_SETFONT, hFont, 0 'tell control to use it<br />
 EnumModules<br />
 Case %wm_size<br />
 Dim rc As RECT<br />
 GetClientRect CbHndl, rc<br />
 SetWindowPos GetDlgItem(CbHndl, %ID_LISTBOX), 0, _<br />
 0.03 * rc.nRight, 0.02 * rc.nBottom, 0.94 * rc.nRight, _<br />
 0.96 * rc.nBottom, %SWP_NOACTIVATE Or %SWP_NOZORDER<br />
 End Select<br />
 End Function<br />
<br />
 Function PBMain<br />
<br />
 Dialog New 0, "Processes and modules with version info", , , 400, 200, %ws_sysmenu Or %ws_caption Or %ws_thickframe Or %ds_modalframe To hDlg<br />
<br />
 Dialog Show Modal hDlg Call DlgProc<br />
<br />
 DeleteObject hFont<br />
<br />
 End Function<br />
<br />
 '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤<br />
 ' Retrieve a system file's version number.. Borrowed from Borje Hagsten<br />
 '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤<br />
 Function GetVersionStringInfo(ByVal Fname As String) As String<br />
<br />
 Local lRes As Long, lZero As Long, sBuf As String, tWFD As WIN32_FIND_DATA<br />
 Local zFile As Asciiz * %MAX_PATH, pFI As VS_FIXEDFILEINFO Ptr<br />
<br />
 zFile = zFile + Fname<br />
<br />
 lRes = FindFirstFile(zFile, tWFD) 'see if it exists<br />
 If lRes = %INVALID_HANDLE_VALUE Then Exit Function<br />
 FindClose lRes<br />
<br />
 lRes = GetFileVersionInfoSize(zFile, lZero) 'can we get any info?<br />
 If lRes = 0 Then Exit Function<br />
<br />
 sBuf = Space&#36;(lRes) 'allocate space<br />
 GetFileVersionInfo zFile, lRes, lRes, ByVal StrPtr(sBuf) 'get version info<br />
 VerQueryValue ByVal StrPtr(sBuf), "&#92;", pFI, lRes 'get VS_FIXEDFILEINFO info<br />
<br />
 'build answer<br />
 sBuf = Format&#36;(HiWrd(@pFI.dwFileVersionMS), "0") &amp; "." &amp; _ 'Major part<br />
 Format&#36;(LoWrd(@pFI.dwFileVersionMS), "00")&amp; "." 'Minor part<br />
<br />
 If @pFI.dwFileVersionLS Then 'rem out to get version only..<br />
 sBuf = sBuf &amp; Format&#36;(HiWrd(@pFI.dwFileVersionLS), "00") &amp; "." &amp; _ 'Major part<br />
 Format&#36;(LoWrd(@pFI.dwFileVersionLS), "0") 'Minor part<br />
 End If<br />
<br />
 Function = sBuf<br />
<br />
 End Function<br />
<br />
 '==========================================================================<br />
 ' Routine to Change Font Original code by Dave Navarro &amp; Borje Hagsten<br />
 '==========================================================================<br />
 Function MakeFontEx(ByVal FontName As String, ByVal PointSize As Long, ByVal fBold As Long, _<br />
 ByVal fItalic As Long, ByVal fUnderline As Long) As Long<br />
<br />
 Local hDC As Dword, CyPixels As Long<br />
<br />
 hDC = GetDC(%HWND_DESKTOP)<br />
 CyPixels = GetDeviceCaps(hDC, %LOGPIXELSY)<br />
 ReleaseDC %HWND_DESKTOP, hDC<br />
 PointSize = 0 - (PointSize * CyPixels) &#92; 72<br />
<br />
 Function = CreateFont( _<br />
 PointSize, 0, _ 'height, width(default=0)<br />
 0, 0, _ 'escapement(angle), orientation<br />
 fBold, _ 'weight (%FW_DONTCARE = 0, %FW_NORMAL = 400, %FW_BOLD = 700)<br />
 fItalic, _ 'Italic<br />
 fUnderline, _ 'Underline<br />
 %FALSE, _ 'StrikeThru - who needs it?<br />
 %ANSI_CHARSET, %OUT_TT_PRECIS, _<br />
 %CLIP_DEFAULT_PRECIS, %DEFAULT_QUALITY, _<br />
 %FF_MODERN+%FIXED_PITCH , ByCopy FontName)<br />
<br />
 End Function</code></div></div>]]></description>
			<content:encoded><![CDATA[این کد ماژولهای هر پروسه ای رو همراه با ورژن اون نشون می ده :<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe<br />
 #Dim All<br />
 #Register None<br />
 #Include "Win32Api.Inc"<br />
<br />
 Global hDlg As Long, hFont As Dword<br />
<br />
<br />
 %TH32CS_SNAPPROCESS = &amp;H2&amp; ' dwFlags for<br />
 %TH32CS_SNAPMODULE = &amp;H8&amp; ' CreateToolhelp32Snapshot<br />
<br />
 %MAX_MODULE_NAME32 = 255<br />
<br />
 Type PROCESSENTRY32<br />
 dwSize As Dword<br />
 cntUsage As Dword<br />
 th32ProcessID As Dword ' This process<br />
 th32DefaultHeapID As Long Ptr<br />
 th32ModuleID As Dword ' Associated exe<br />
 cntThreads As Dword<br />
 th32ParentProcessID As Dword ' This process's parent process<br />
 pcPriClassBase As Long ' Base priority of process threads<br />
 dwFlags As Dword<br />
 szExeFile As Asciiz * %MAX_PATH ' Path<br />
 End Type<br />
<br />
 Type MODULEENTRY32<br />
 dwSize As Dword<br />
 th32ModuleID As Dword ' This module<br />
 th32ProcessID As Dword ' Owning process<br />
 GlblcntUsage As Dword ' Global usage count on the module<br />
 ProccntUsage As Dword ' Module usage count in th32ProcessID's context<br />
 modBaseAddr As Byte Ptr ' Base address of module in th32ProcessID's context<br />
 modBaseSize As Dword ' Size in bytes of module starting at modBaseAddr<br />
 hModule As Dword ' The hModule of this module in th32ProcessID's context<br />
 szModule As Asciiz * (%MAX_MODULE_NAME32 + 1)<br />
 szExePath As Asciiz * %MAX_PATH<br />
 End Type<br />
<br />
<br />
 Declare Function CreateToolhelp32Snapshot (ByVal dwFlags As Dword, ByVal th32ProcessID As Dword) As Long<br />
 Declare Function Process32First (ByVal hSnapshot As Dword, pe As PROCESSENTRY32) As Long<br />
 Declare Function Process32Next (ByVal hSnapshot As Dword, pe As PROCESSENTRY32) As Long<br />
 Declare Function Module32First (ByVal hSnapshot As Dword, Me As MODULEENTRY32) As Long<br />
 Declare Function Module32Next (ByVal hSnapshot As Dword, Me As MODULEENTRY32) As Long<br />
 Declare Function EnumProcesses (idProcess As Dword, ByVal cb As Dword, cbNeeded As Dword) As Long<br />
 Declare Function GetModuleFileNameEx (ByVal hProcess As Dword, ByVal hModule As Dword, ModuleName As Asciiz, ByVal nSize As Dword) As Dword<br />
 Declare Function EnumProcessModules (ByVal hProcess As Dword, hModule As Dword, ByVal cb As Dword, cbNeeded As Dword) As Long<br />
 Declare Function GetVersionStringInfo (ByVal Fname As String) As String<br />
 Declare Function MakeFontEx(ByVal FontName As String, ByVal PointSize As Long, ByVal fBold As Long, _<br />
 ByVal fItalic As Long, ByVal fUnderline As Long) As Long<br />
<br />
 %ID_LISTBOX = 1001<br />
<br />
 Sub EnumModules<br />
 Dim hKernel32 As Local Dword<br />
 Dim hCreateToolhelp32Snapshot As Local Dword<br />
 Dim hProcess32Next As Local Dword<br />
 Dim hProcess32First As Local Dword<br />
 Dim hModule32First As Local Dword<br />
 Dim hModule32Next As Local Dword<br />
 Dim hPsApiDll As Local Dword<br />
 Dim hEnumProcesses As Local Dword<br />
 Dim hGetModuleFileNameEx As Local Dword<br />
 Dim hEnumProcessModules As Local Dword<br />
<br />
 Dim os As Local OSVERSIONINFO<br />
 Dim pe As Local PROCESSENTRY32<br />
 Dim mee As Local MODULEENTRY32<br />
 Dim hProcessSnap As Local Dword<br />
 Dim hModuleSnap As Local Dword<br />
 Dim nModules As Local Dword<br />
 Dim nProcesses As Local Dword<br />
 Dim hProcess As Local Dword<br />
 Dim lResult1 As Local Long<br />
 Dim lResult2 As Local Long<br />
 Dim cb As Local Dword<br />
 Dim cbNeeded As Local Dword<br />
 Dim i As Local Dword<br />
 Dim j As Local Dword<br />
<br />
 os.dwOSVersionInfoSize = SizeOf(os)<br />
 GetVersionEx ByVal VarPtr(os)<br />
 ListBox Reset hDlg, %ID_LISTBOX<br />
<br />
 If IsFalse(os.dwPlatformId = %VER_PLATFORM_WIN32_NT) Then ' Windows 95/98<br />
<br />
 hKernel32 = GetModuleHandle("kernel32.dll")<br />
 hCreateToolhelp32Snapshot = GetProcAddress(hKernel32, "CreateToolhelp32Snapshot")<br />
 hProcess32Next = GetProcAddress(hKernel32, "Process32Next")<br />
 hProcess32First = GetProcAddress(hKernel32, "Process32First")<br />
 hModule32First = GetProcAddress(hKernel32, "Module32First")<br />
 hModule32Next = GetProcAddress(hKernel32, "Module32Next")<br />
<br />
 Call Dword hCreateToolhelp32Snapshot Using CreateToolhelp32Snapshot (%TH32CS_SNAPPROCESS, 0&amp;) To hProcessSnap<br />
 If hProcessSnap &lt;&gt; %INVALID_HANDLE_VALUE Then<br />
 pe.dwSize = SizeOf(pe)<br />
 Call Dword hProcess32First Using Process32First (hProcessSnap, pe) To lResult1<br />
 While lResult1<br />
 ListBox Add hDlg, %ID_LISTBOX, pe.szExeFile<br />
<br />
 Call Dword hCreateToolhelp32Snapshot Using CreateToolhelp32Snapshot(%TH32CS_SNAPMODULE, pe.th32ProcessID) To hModuleSnap<br />
 If hModuleSnap &lt;&gt; %INVALID_HANDLE_VALUE Then<br />
 mee.dwSize = SizeOf(MODULEENTRY32)<br />
 Call Dword hModule32First Using Module32First (hModuleSnap, mee) To lResult2<br />
 While lResult2<br />
 If pe.th32ModuleID &lt;&gt; mee.th32ModuleID Then _<br />
 ListBox Add hDlg, %ID_LISTBOX, " " + _<br />
 LSet&#36;(GetVersionStringInfo(mee.szExePath),16) + mee.szExePath<br />
 Call Dword hModule32Next Using Module32Next (hModuleSnap, mee) To lResult2<br />
 Wend<br />
 CloseHandle hModuleSnap<br />
 ListBox Add hDlg, %ID_LISTBOX, "--------------------------------"<br />
 End If<br />
 Call Dword hProcess32Next Using Process32Next (hProcessSnap, pe) To Lresult1<br />
 Wend<br />
 CloseHandle hProcessSnap<br />
 End If<br />
<br />
 Else ' Windows NT<br />
 hPsApiDll = GetModuleHandle("psApi.dll"): If hPsApiDll = 0 Then hPsApiDll = LoadLibrary("psApi.dll")<br />
 hEnumProcesses = GetProcAddress(hPsApiDll, "EnumProcesses")<br />
 hGetModuleFileNameEx = GetProcAddress(hPsApiDll, "GetModuleFileNameExA")<br />
 hEnumProcessModules = GetProcAddress(hPsApiDll, "EnumProcessModules")<br />
<br />
 cb = 100<br />
 Do<br />
 ReDim ProcessIDs(1 To cb &#92; 4) As Dword<br />
 Call Dword hEnumProcesses Using EnumProcesses (ProcessIDs(1), cb, cbNeeded) To lResult1<br />
 If cb &gt; cbNeeded Then Exit Do<br />
 cb = cb + cb<br />
 Loop<br />
 nProcesses = cbNeeded &#92; 4<br />
<br />
 For i = 1 To nProcesses<br />
 hProcess = OpenProcess(%PROCESS_QUERY_INFORMATION Or %PROCESS_VM_READ, %False, ProcessIDs(i))<br />
 If hProcess Then<br />
 cb = 100<br />
 Do<br />
 ReDim Modules(1 To cb / 4) As Dword<br />
 Call Dword hEnumProcessModules Using EnumProcessModules (hProcess, Modules(1), cb, cbNeeded) To lResult1<br />
 If lResult1 = 0 Then cbNeeded = 0: Exit Do<br />
 If cb &gt; cbNeeded Then Exit Do Else cb = cb * 2<br />
 Loop<br />
 nModules = cbNeeded / 4<br />
 For j = 1 To nModules<br />
 Call Dword hGetModuleFileNameEx Using GetModuleFileNameEx (hProcess, Modules(j), pe.szExeFile, SizeOf(pe.szExeFile)) To lResult1<br />
 If lResult1 Then If j = 1 Then ListBox Add hDlg, %ID_LISTBOX, pe.szExeFile Else _<br />
 ListBox Add hDlg, %ID_LISTBOX, " " + _<br />
 LSet&#36;(GetVersionStringInfo(pe.szExeFile),16)+ _<br />
 pe.szExeFile<br />
 Next<br />
 CloseHandle hProcess<br />
 ListBox Add hDlg, %ID_LISTBOX, "--------------------------------"<br />
 End If<br />
 Next<br />
 End If<br />
 End Sub<br />
<br />
 CallBack Function DlgProc<br />
 Select Case CbMsg<br />
 Case %wm_initdialog<br />
 Control Add ListBox, CbHndl, %ID_LISTBOX, , 0, 0, 0, 0, %ws_child Or %ws_vscroll, %ws_ex_clientedge<br />
 hFont = MakeFontEx("System", 10,%FW_LIGHT, 0, 0) 'create desired font<br />
 Control Send CbHndl, %ID_LISTBOX, %WM_SETFONT, hFont, 0 'tell control to use it<br />
 EnumModules<br />
 Case %wm_size<br />
 Dim rc As RECT<br />
 GetClientRect CbHndl, rc<br />
 SetWindowPos GetDlgItem(CbHndl, %ID_LISTBOX), 0, _<br />
 0.03 * rc.nRight, 0.02 * rc.nBottom, 0.94 * rc.nRight, _<br />
 0.96 * rc.nBottom, %SWP_NOACTIVATE Or %SWP_NOZORDER<br />
 End Select<br />
 End Function<br />
<br />
 Function PBMain<br />
<br />
 Dialog New 0, "Processes and modules with version info", , , 400, 200, %ws_sysmenu Or %ws_caption Or %ws_thickframe Or %ds_modalframe To hDlg<br />
<br />
 Dialog Show Modal hDlg Call DlgProc<br />
<br />
 DeleteObject hFont<br />
<br />
 End Function<br />
<br />
 '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤<br />
 ' Retrieve a system file's version number.. Borrowed from Borje Hagsten<br />
 '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤<br />
 Function GetVersionStringInfo(ByVal Fname As String) As String<br />
<br />
 Local lRes As Long, lZero As Long, sBuf As String, tWFD As WIN32_FIND_DATA<br />
 Local zFile As Asciiz * %MAX_PATH, pFI As VS_FIXEDFILEINFO Ptr<br />
<br />
 zFile = zFile + Fname<br />
<br />
 lRes = FindFirstFile(zFile, tWFD) 'see if it exists<br />
 If lRes = %INVALID_HANDLE_VALUE Then Exit Function<br />
 FindClose lRes<br />
<br />
 lRes = GetFileVersionInfoSize(zFile, lZero) 'can we get any info?<br />
 If lRes = 0 Then Exit Function<br />
<br />
 sBuf = Space&#36;(lRes) 'allocate space<br />
 GetFileVersionInfo zFile, lRes, lRes, ByVal StrPtr(sBuf) 'get version info<br />
 VerQueryValue ByVal StrPtr(sBuf), "&#92;", pFI, lRes 'get VS_FIXEDFILEINFO info<br />
<br />
 'build answer<br />
 sBuf = Format&#36;(HiWrd(@pFI.dwFileVersionMS), "0") &amp; "." &amp; _ 'Major part<br />
 Format&#36;(LoWrd(@pFI.dwFileVersionMS), "00")&amp; "." 'Minor part<br />
<br />
 If @pFI.dwFileVersionLS Then 'rem out to get version only..<br />
 sBuf = sBuf &amp; Format&#36;(HiWrd(@pFI.dwFileVersionLS), "00") &amp; "." &amp; _ 'Major part<br />
 Format&#36;(LoWrd(@pFI.dwFileVersionLS), "0") 'Minor part<br />
 End If<br />
<br />
 Function = sBuf<br />
<br />
 End Function<br />
<br />
 '==========================================================================<br />
 ' Routine to Change Font Original code by Dave Navarro &amp; Borje Hagsten<br />
 '==========================================================================<br />
 Function MakeFontEx(ByVal FontName As String, ByVal PointSize As Long, ByVal fBold As Long, _<br />
 ByVal fItalic As Long, ByVal fUnderline As Long) As Long<br />
<br />
 Local hDC As Dword, CyPixels As Long<br />
<br />
 hDC = GetDC(%HWND_DESKTOP)<br />
 CyPixels = GetDeviceCaps(hDC, %LOGPIXELSY)<br />
 ReleaseDC %HWND_DESKTOP, hDC<br />
 PointSize = 0 - (PointSize * CyPixels) &#92; 72<br />
<br />
 Function = CreateFont( _<br />
 PointSize, 0, _ 'height, width(default=0)<br />
 0, 0, _ 'escapement(angle), orientation<br />
 fBold, _ 'weight (%FW_DONTCARE = 0, %FW_NORMAL = 400, %FW_BOLD = 700)<br />
 fItalic, _ 'Italic<br />
 fUnderline, _ 'Underline<br />
 %FALSE, _ 'StrikeThru - who needs it?<br />
 %ANSI_CHARSET, %OUT_TT_PRECIS, _<br />
 %CLIP_DEFAULT_PRECIS, %DEFAULT_QUALITY, _<br />
 %FF_MODERN+%FIXED_PITCH , ByCopy FontName)<br />
<br />
 End Function</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[هوک کردن پیغام های ارسالی بین پنجره ها]]></title>
			<link>https://www.iranled.com/forum/thread-11744.html</link>
			<pubDate>Mon, 16 Feb 2009 16:35:54 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11744.html</guid>
			<description><![CDATA[این برنامه هر نوع کاری را که باعث فرستادن پیغام شود هوک کرده و پیغام آن را باز می گرداند<br />
<br />
مثل حرکت ماوس،کلیک،فشردن یک کلید از کیبورد و هر کار دیگری<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2213" target="_blank">MsgViewer.zip</a> (اندازه:  4.37 KB / تعداد دفعات دریافت:  220)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[این برنامه هر نوع کاری را که باعث فرستادن پیغام شود هوک کرده و پیغام آن را باز می گرداند<br />
<br />
مثل حرکت ماوس،کلیک،فشردن یک کلید از کیبورد و هر کار دیگری<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2213" target="_blank">MsgViewer.zip</a> (اندازه:  4.37 KB / تعداد دفعات دریافت:  220)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[پاوربیسیک فوق العاده قدرتمندتر از گذشته]]></title>
			<link>https://www.iranled.com/forum/thread-11725.html</link>
			<pubDate>Sun, 15 Feb 2009 12:18:03 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11725.html</guid>
			<description><![CDATA[برنامه PwrDev یک محیط برای طراحی فرمها برای کامپایلر پاوربیسیک بود که در ورژن جدید آن<br />
<br />
که در همین ماه میلادی سال 2009 منتشر شد امکانات بسیار زیادی به آن اضافه شد<br />
<br />
و در این محیط دیگر نیازی به نصب خوده کامپایلر پاوربیسیک ندارید<br />
<br />
این ورژن از پاوربیسیک ویندوز 9 و کنسول 5 پشتیبانی کامل می کند و قابلیت اجرا روی لینوکس را نیز داراست<br />
<br />
این محیط از کنترلهای استاندارد زیاد درکنار دیگر Activex ها و کامپونتها بهره می برد<br />
<br />
<img src="http://www.hellobasic.com/pwrdev/images/pwrdev/pwrdev1.gif" alt="[تصویر:  pwrdev1.gif]" class="mycode_img" /><br />
<br />
این محیط به شما این امکان را می دهد که برنامه های خود را بر اساس .Net و FrameWork بسازید<br />
<br />
شما می توانید در ساخت برنامه های خود از زبانهای دیگر نظیر #C و VB.Net در کنار پاوربیسیک بهره بگیرید<br />
<br />
شما به طور مستقیم کنترل های .Net را در برنامه خود به کار بگیرید<br />
<br />
PwrDev از هر دو مدل DDT و SDK برای ساخت برنامه های Win32 و کنسول پشتیبانی می کند<br />
<br />
برای کار با این محیط داشتن دانش بسیار ساده و کم درباره API ها کافیست<br />
<br />
خروجی این محیط می تواند :<br />
<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite><div style="text-align: left;" class="mycode_align">
 Windows applications (PB/WIN, PB/CC)<br />
<br />
Console(PB/WIN, PB/CC)<br />
<br />
CGI(PB/WIN, PB/CC)<br />
<br />
NT-service(PB/WIN, PB/CC)<br />
<br />
Libraries(PB/WIN)<br />
<br />
Controlpanel applets(PB/WIN)<br />
<br />
Excel Addins<br />
</div></blockquote>
باشد <br />
<br />
شما می توانید کنترلهای مورد نیاز خود را طراحی و در برنامه استفاده کنید<br />
<br />
از نظر ActiveX های PwrDev از موارد زیر پشتیبانی می کند<br />
<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite><div style="text-align: left;" class="mycode_align">
ATL<br />
<br />
JACOMPB<br />
<br />
IStream interface<br />
<br />
XLS functions<br />
<br />
XML functions<br />
</div></blockquote>
<br />
که قدرت زیادی به شما در ساخت برنامه می بخشد<br />
<br />
از نظر برنامه نویسی شی گرا نیز این محیط قدرت زیادی دارد و به صورت اتوماتیک به ساخت و توضیح<br />
<br />
کلاسهای و اشیا آنها می پردازد<br />
<br />
خوده این محیط از دستورات بی شماری جهت کار با دیگر قسمتهای ویندوز، فایل ها و ...<br />
<br />
می پردازد که مهمترین این توابع برای کار با موارد زیر تعبیه شده اند <br />
<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite><div style="text-align: left;" class="mycode_align">
Clipboard<br />
<br />
Functions for standard and common controls like CheckBox, listbox, listview,...<br />
<br />
Resources (rc)<br />
<br />
INIfile<br />
<br />
Registry<br />
<br />
GDIPlus<br />
<br />
Image support like JPG, GIF<br />
<br />
Printer<br />
</div></blockquote>
<br />
در این محیط کار با کنترلها بسیار راحت شده است و به سرعت می توانید به کنترلهای مورد نیاز خود<br />
<br />
دسترسی و از آنها استفاده کنید مثل Dialog ها و دیگر کنترلها مثل Winsock و Innet و دیگر کنترلها<br />
<br />
و کامپونت های موجود در کامپیوتر شما<br />
<br />
برای کار با Database هم این محیط کار را ساده کرده است و به جز قابلیتهای خوده پاوربیسیک<br />
<br />
به شما اجازه استفاده از ADO و نسخه های 2 و 3 SQLite را می دهد<br />
<br />
برنامه های شما می تواند Webbaced باشد<br />
<br />
این محیط حتی برای فشرده سازی فایلها نیز دستوراتی دارد و از LZExpand و ZLIB نسخه 1.14 پشتیبانی می کند<br />
<br />
از نظر تنظیمات هم برای پروژه های شما کارهای زیادی شده تا برنامه در سطح بالاتری بهینه سازی شود<br />
<br />
<img src="http://www.hellobasic.com/pwrdev/images/pwrdev/pwrdev4.gif" alt="[تصویر:  pwrdev4.gif]" class="mycode_img" /><br />
<br />
حداقل سیستم مورد نیاز برای این محیط ویندوز98 است که ویندوز XP پیشنهاد می شود<br />
<br />
حالا این قدرت رو با قدرت کامپایلر پاوربیسیک به تنهایی مثل : استفاده از اسمبلی و ... جمع کنید و قدرت واقعی این محیط رو حس کنید]]></description>
			<content:encoded><![CDATA[برنامه PwrDev یک محیط برای طراحی فرمها برای کامپایلر پاوربیسیک بود که در ورژن جدید آن<br />
<br />
که در همین ماه میلادی سال 2009 منتشر شد امکانات بسیار زیادی به آن اضافه شد<br />
<br />
و در این محیط دیگر نیازی به نصب خوده کامپایلر پاوربیسیک ندارید<br />
<br />
این ورژن از پاوربیسیک ویندوز 9 و کنسول 5 پشتیبانی کامل می کند و قابلیت اجرا روی لینوکس را نیز داراست<br />
<br />
این محیط از کنترلهای استاندارد زیاد درکنار دیگر Activex ها و کامپونتها بهره می برد<br />
<br />
<img src="http://www.hellobasic.com/pwrdev/images/pwrdev/pwrdev1.gif" alt="[تصویر:  pwrdev1.gif]" class="mycode_img" /><br />
<br />
این محیط به شما این امکان را می دهد که برنامه های خود را بر اساس .Net و FrameWork بسازید<br />
<br />
شما می توانید در ساخت برنامه های خود از زبانهای دیگر نظیر #C و VB.Net در کنار پاوربیسیک بهره بگیرید<br />
<br />
شما به طور مستقیم کنترل های .Net را در برنامه خود به کار بگیرید<br />
<br />
PwrDev از هر دو مدل DDT و SDK برای ساخت برنامه های Win32 و کنسول پشتیبانی می کند<br />
<br />
برای کار با این محیط داشتن دانش بسیار ساده و کم درباره API ها کافیست<br />
<br />
خروجی این محیط می تواند :<br />
<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite><div style="text-align: left;" class="mycode_align">
 Windows applications (PB/WIN, PB/CC)<br />
<br />
Console(PB/WIN, PB/CC)<br />
<br />
CGI(PB/WIN, PB/CC)<br />
<br />
NT-service(PB/WIN, PB/CC)<br />
<br />
Libraries(PB/WIN)<br />
<br />
Controlpanel applets(PB/WIN)<br />
<br />
Excel Addins<br />
</div></blockquote>
باشد <br />
<br />
شما می توانید کنترلهای مورد نیاز خود را طراحی و در برنامه استفاده کنید<br />
<br />
از نظر ActiveX های PwrDev از موارد زیر پشتیبانی می کند<br />
<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite><div style="text-align: left;" class="mycode_align">
ATL<br />
<br />
JACOMPB<br />
<br />
IStream interface<br />
<br />
XLS functions<br />
<br />
XML functions<br />
</div></blockquote>
<br />
که قدرت زیادی به شما در ساخت برنامه می بخشد<br />
<br />
از نظر برنامه نویسی شی گرا نیز این محیط قدرت زیادی دارد و به صورت اتوماتیک به ساخت و توضیح<br />
<br />
کلاسهای و اشیا آنها می پردازد<br />
<br />
خوده این محیط از دستورات بی شماری جهت کار با دیگر قسمتهای ویندوز، فایل ها و ...<br />
<br />
می پردازد که مهمترین این توابع برای کار با موارد زیر تعبیه شده اند <br />
<br />
<blockquote class="mycode_quote"><cite>نقل قول: </cite><div style="text-align: left;" class="mycode_align">
Clipboard<br />
<br />
Functions for standard and common controls like CheckBox, listbox, listview,...<br />
<br />
Resources (rc)<br />
<br />
INIfile<br />
<br />
Registry<br />
<br />
GDIPlus<br />
<br />
Image support like JPG, GIF<br />
<br />
Printer<br />
</div></blockquote>
<br />
در این محیط کار با کنترلها بسیار راحت شده است و به سرعت می توانید به کنترلهای مورد نیاز خود<br />
<br />
دسترسی و از آنها استفاده کنید مثل Dialog ها و دیگر کنترلها مثل Winsock و Innet و دیگر کنترلها<br />
<br />
و کامپونت های موجود در کامپیوتر شما<br />
<br />
برای کار با Database هم این محیط کار را ساده کرده است و به جز قابلیتهای خوده پاوربیسیک<br />
<br />
به شما اجازه استفاده از ADO و نسخه های 2 و 3 SQLite را می دهد<br />
<br />
برنامه های شما می تواند Webbaced باشد<br />
<br />
این محیط حتی برای فشرده سازی فایلها نیز دستوراتی دارد و از LZExpand و ZLIB نسخه 1.14 پشتیبانی می کند<br />
<br />
از نظر تنظیمات هم برای پروژه های شما کارهای زیادی شده تا برنامه در سطح بالاتری بهینه سازی شود<br />
<br />
<img src="http://www.hellobasic.com/pwrdev/images/pwrdev/pwrdev4.gif" alt="[تصویر:  pwrdev4.gif]" class="mycode_img" /><br />
<br />
حداقل سیستم مورد نیاز برای این محیط ویندوز98 است که ویندوز XP پیشنهاد می شود<br />
<br />
حالا این قدرت رو با قدرت کامپایلر پاوربیسیک به تنهایی مثل : استفاده از اسمبلی و ... جمع کنید و قدرت واقعی این محیط رو حس کنید]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[مانیتوریگ یک تابع API]]></title>
			<link>https://www.iranled.com/forum/thread-11683.html</link>
			<pubDate>Thu, 12 Feb 2009 17:46:54 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11683.html</guid>
			<description><![CDATA[این کد کارش اینه که بی خود و بی جهت تابع ShellExecuteEx رو با پارامترهای اشتباه فراخوانی می کنه<br />
<br />
که منجر به بروز خطا می شه <br />
<br />
و سپس کارهای انجام شده را نظارت کرده و خطا را پیدا می کند<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2192" target="_blank">MonitorAPI.zip</a> (اندازه:  1.79 KB / تعداد دفعات دریافت:  267)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[این کد کارش اینه که بی خود و بی جهت تابع ShellExecuteEx رو با پارامترهای اشتباه فراخوانی می کنه<br />
<br />
که منجر به بروز خطا می شه <br />
<br />
و سپس کارهای انجام شده را نظارت کرده و خطا را پیدا می کند<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2192" target="_blank">MonitorAPI.zip</a> (اندازه:  1.79 KB / تعداد دفعات دریافت:  267)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[نمایش درختی کلیدهای رجیستری]]></title>
			<link>https://www.iranled.com/forum/thread-11658.html</link>
			<pubDate>Mon, 09 Feb 2009 11:36:11 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11658.html</guid>
			<description><![CDATA[نمایش درختی کلیدهای رجیستری<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe<br />
#Option Version5<br />
#Dim All<br />
#Register All<br />
#Include "win32api.inc"<br />
#Include "commctrl.inc"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %max_computername_length = 15<br />
'------------------------------------------------------------------------------<br />
%id_reg_treeview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 100<br />
'------------------------------------------------------------------------------<br />
Global shivelist()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp; ' hive path strings<br />
Global lhivelistcount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp;&nbsp;&nbsp; ' array index counter<br />
Global ltotalhivecount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp; ' can be removed<br />
Global hregtreeview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp;&nbsp;&nbsp; ' treeview handle<br />
'------------------------------------------------------------------------------<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvgettext(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ztext As Asciiz * %max_dir<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ltvitem As tv_item<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.hitem = htvitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.mask = %tvif_text<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.psztext = VarPtr(ztext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.cchtextmax = %max_dir<br />
&nbsp;&nbsp;&nbsp;&nbsp;treeview_getitem(getdlgitem(hparent, hcontrol), ltvitem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = ztext<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvsettext(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long, ByVal stxt As String) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tvedititem As tv_item<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.mask = %tvif_handle Or %tvif_text<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.hitem = htvitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.cchtextmax = %max_dir<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.psztext = StrPtr(stxt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_setitem(getdlgitem(hparent, hcontrol), tvedititem)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvgetfullpath(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local strpath As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hcurrent As Dword<br />
&nbsp;&nbsp;&nbsp;&nbsp;hcurrent = htvitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do Until hcurrent = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strpath = tvgettext( hparent, hcontrol, hcurrent ) &amp; "&#92;" &amp; strpath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hcurrent = treeview_getparent( getdlgitem(hparent, hcontrol) , hcurrent )<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = RTrim&#36;( strpath, "&#92;" )<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvselectitem(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_select(getdlgitem(hparent, hcontrol), htvitem, %tvgn_caret)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvexpand(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_expand(getdlgitem(hparent, hcontrol), htvitem, %tve_expand)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvinsertitem(ByVal htree As Long, ByVal hparent As Long, stxt As String) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tv_insert As tv_insertstruct<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tv_itm&nbsp;&nbsp; As tv_item<br />
&nbsp;&nbsp;&nbsp;&nbsp;If hparent Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tv_itm.mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= %tvif_children Or %tvif_handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tv_itm.hitem&nbsp;&nbsp;&nbsp;&nbsp; = hparent<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tv_itm.cchildren = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeview_setitem(htree, tv_itm)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.hparent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= hparent<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.item.item.mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = %tvif_state Or %tvif_text Or %tvif_image Or %tvif_selectedimage<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.item.item.psztext&nbsp;&nbsp;&nbsp;&nbsp;= StrPtr(stxt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.item.item.cchtextmax = Len(stxt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_insertitem(htree, tv_insert)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function computername As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim retcode&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lpbuffer&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * %max_computername_length + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim nsize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;nsize = %max_computername_length + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;retcode = getcomputername(lpbuffer,nsize)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = UCase&#36;(Trim&#36;(lpbuffer))<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function enumregsubkeys(hivekey As Long, zstartsubkey As Asciiz) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hkey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local dwindex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lastwritetime As filetime<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local zname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * %max_path<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local zclass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * %max_path<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If regopenkeyex(hivekey, zstartsubkey, 0, %key_enumerate_sub_keys Or %key_all_access, hkey) = %error_success Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'sizeof(zname)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(zclass)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If regenumkeyex(hkey, dwindex, ByVal VarPtr(zname), %max_path, %null, zclass, %max_path, lastwritetime) = %error_success Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Trim&#36;(zstartsubkey) = "" Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve shivelist(lhivelistcount)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shivelist(lhivelistcount) = zname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr lhivelistcount<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** do a recursive search for more 'local' entries...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enumregsubkeys hivekey, zname<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve shivelist(lhivelistcount)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shivelist(lhivelistcount) = zstartsubkey &amp; "&#92;" &amp; zname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr lhivelistcount<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** do a recursive search for more 'global' entries...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enumregsubkeys hivekey, zstartsubkey &amp; "&#92;" &amp; zname<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** update index<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr dwindex<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regclosekey hkey<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Sub getregpathstr(ByVal lreghivehandle As Long, ByVal hivekey As Long)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lcnt As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local sregpathstr As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lregpathlen As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** prepare counter and arrays for new data<br />
&nbsp;&nbsp;&nbsp;&nbsp;lhivelistcount = 0<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** setup the treeview handle array<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim reghivehandlelist(0) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;reghivehandlelist(0) = lreghivehandle<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** setup the registry path string array<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim shivelist(0)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** get the subkeys for the hive<br />
&nbsp;&nbsp;&nbsp;&nbsp;Call enumregsubkeys(hivekey, "")<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** fill treeview with registry path data from shivelist array<br />
&nbsp;&nbsp;&nbsp;&nbsp;For lcnt = 0 To UBound(shivelist)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** get registry path string<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sregpathstr = shivelist(lcnt)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** get number of keys/nodes in the registry path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lregpathlen = ParseCount(sregpathstr,"&#92;")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If lregpathlen &lt; 1 Then lregpathlen = 1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** prepare array for the new treeview item handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve reghivehandlelist(lregpathlen)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** insert registry path item into treeview and update reghivehandlelist<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reghivehandlelist(lregpathlen) = tvinsertitem(hregtreeview, reghivehandlelist(lregpathlen-1), Parse&#36;(sregpathstr,"&#92;",lregpathlen) )<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** release the arrays<br />
&nbsp;&nbsp;&nbsp;&nbsp;Erase shivelist()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Erase reghivehandlelist()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltotalhivecount = ltotalhivecount + lhivelistcount ' can be removed<br />
<br />
End Sub<br />
CallBack Function hdlgproc() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local trect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As rect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' size dialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hroot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhkcr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhkcu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhklm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhku&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhkcc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lptv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As nm_treeview Ptr&nbsp;&nbsp;' treeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lpnmh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As nmhdr Ptr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' treeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static htreeitem&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' treeview, the selected item<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static htime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' can be removed<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ltime1, ltime2 As Long ' can be removed<br />
&nbsp;&nbsp;&nbsp;&nbsp;Select Case CbMsg<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_initdialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hroot = tvinsertitem(hregtreeview, 0, computername)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhkcr = tvinsertitem(hregtreeview, hroot, "hkey_classes_root")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhkcu = tvinsertitem(hregtreeview, hroot, "hkey_current_user")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhklm = tvinsertitem(hregtreeview, hroot, "hkey_local_machine")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhku&nbsp;&nbsp;= tvinsertitem(hregtreeview, hroot, "hkey_users")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhkcc = tvinsertitem(hregtreeview, hroot, "hkey_current_config")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htime = tvinsertitem(hregtreeview, 0, "load time: ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvexpand(CbHndl, %id_reg_treeview, hroot)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postmessage CbHndl, %wm_user + 1000, 0, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_user + 1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvsettext(CbHndl, %id_reg_treeview, hroot, "reading registry... ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltime1 = Timer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhkcr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhkcr, %hkey_classes_root)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhkcu)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhkcu, %hkey_current_user)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhklm)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhklm, %hkey_local_machine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhku)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhku, %hkey_users)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhkcc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhkcc, %hkey_current_config)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltime2 = Timer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tvsettext(CbHndl, %id_reg_treeview, htime, "load time: " &amp; Format&#36;(ltotalhivecount) &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " registry keys in " &amp; Format&#36;(ltime2-ltime1) &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " seconds (" &amp; Format&#36;(ltotalhivecount &#92; (ltime2-ltime1)) &amp; " keys/sec)" ) ' can be removed<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvsettext(CbHndl, %id_reg_treeview, hroot, computername)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hroot)<br />
&nbsp;&nbsp;&nbsp;&nbsp; Case %wm_notify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpnmh = CbLParam<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lptv = CbLParam<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select Case CbCtl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %id_reg_treeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case @lpnmh.code<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case %tvn_selchangingn<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htreeitem = @lptv.itemnew.hitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dialog Set Text CbHndl, &#36;Spc &amp; tvgetfullpath(CbHndl, %id_reg_treeview, htreeitem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %tvn_itemexpanded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htreeitem = @lptv.itemnew.hitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, htreeitem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case %wm_command<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case CbCtl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case %idcancel<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CbCtlMsg = %bn_clicked Then Dialog End CbHndl, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getclientrect CbHndl, trect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movewindow(hregtreeview, 1, 1, trect.nright-2, trect.nbottom-2, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_destroy<br />
&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
End Function<br />
Function PBMain() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hdlg As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dialog New Pixels, 0, "registry to treeview",,, 400, 300, %ws_child Or %ws_sysmenu Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%ws_maximizebox Or %ws_minimizebox Or %ws_caption Or %ws_thickframe To hdlg<br />
&nbsp;&nbsp;&nbsp;&nbsp;Control Add "systreeview32", hdlg, %id_reg_treeview, "", 0, 0, 0, 0, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%ws_child Or %ws_visible Or %tvs_hasbuttons Or %tvs_haslines Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%tvs_linesatroot Or %tvs_showselalways, %ws_ex_clientedge<br />
&nbsp;&nbsp;&nbsp;&nbsp;Control Handle hdlg, %id_reg_treeview To hregtreeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dialog Show Modal hdlg Call hdlgproc<br />
End Function</code></div></div>]]></description>
			<content:encoded><![CDATA[نمایش درختی کلیدهای رجیستری<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>#Compile Exe<br />
#Option Version5<br />
#Dim All<br />
#Register All<br />
#Include "win32api.inc"<br />
#Include "commctrl.inc"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %max_computername_length = 15<br />
'------------------------------------------------------------------------------<br />
%id_reg_treeview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 100<br />
'------------------------------------------------------------------------------<br />
Global shivelist()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As String&nbsp;&nbsp; ' hive path strings<br />
Global lhivelistcount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp;&nbsp;&nbsp; ' array index counter<br />
Global ltotalhivecount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp; ' can be removed<br />
Global hregtreeview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long&nbsp;&nbsp;&nbsp;&nbsp; ' treeview handle<br />
'------------------------------------------------------------------------------<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvgettext(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ztext As Asciiz * %max_dir<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ltvitem As tv_item<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.hitem = htvitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.mask = %tvif_text<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.psztext = VarPtr(ztext)<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltvitem.cchtextmax = %max_dir<br />
&nbsp;&nbsp;&nbsp;&nbsp;treeview_getitem(getdlgitem(hparent, hcontrol), ltvitem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = ztext<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvsettext(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long, ByVal stxt As String) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tvedititem As tv_item<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.mask = %tvif_handle Or %tvif_text<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.hitem = htvitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.cchtextmax = %max_dir<br />
&nbsp;&nbsp;&nbsp;&nbsp;tvedititem.psztext = StrPtr(stxt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_setitem(getdlgitem(hparent, hcontrol), tvedititem)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvgetfullpath(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local strpath As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hcurrent As Dword<br />
&nbsp;&nbsp;&nbsp;&nbsp;hcurrent = htvitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;Do Until hcurrent = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strpath = tvgettext( hparent, hcontrol, hcurrent ) &amp; "&#92;" &amp; strpath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hcurrent = treeview_getparent( getdlgitem(hparent, hcontrol) , hcurrent )<br />
&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = RTrim&#36;( strpath, "&#92;" )<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvselectitem(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_select(getdlgitem(hparent, hcontrol), htvitem, %tvgn_caret)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvexpand(ByVal hparent As Long, ByVal hcontrol As Long, ByVal htvitem As Long) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_expand(getdlgitem(hparent, hcontrol), htvitem, %tve_expand)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function tvinsertitem(ByVal htree As Long, ByVal hparent As Long, stxt As String) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tv_insert As tv_insertstruct<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local tv_itm&nbsp;&nbsp; As tv_item<br />
&nbsp;&nbsp;&nbsp;&nbsp;If hparent Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tv_itm.mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= %tvif_children Or %tvif_handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tv_itm.hitem&nbsp;&nbsp;&nbsp;&nbsp; = hparent<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tv_itm.cchildren = 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;treeview_setitem(htree, tv_itm)<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.hparent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= hparent<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.item.item.mask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = %tvif_state Or %tvif_text Or %tvif_image Or %tvif_selectedimage<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.item.item.psztext&nbsp;&nbsp;&nbsp;&nbsp;= StrPtr(stxt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;tv_insert.item.item.cchtextmax = Len(stxt)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = treeview_insertitem(htree, tv_insert)<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function computername As String<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim retcode&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim lpbuffer&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * %max_computername_length + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim nsize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;nsize = %max_computername_length + 1<br />
&nbsp;&nbsp;&nbsp;&nbsp;retcode = getcomputername(lpbuffer,nsize)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Function = UCase&#36;(Trim&#36;(lpbuffer))<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Function enumregsubkeys(hivekey As Long, zstartsubkey As Asciiz) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hkey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local dwindex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lastwritetime As filetime<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local zname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Asciiz * %max_path<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local zclass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Asciiz * %max_path<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;If regopenkeyex(hivekey, zstartsubkey, 0, %key_enumerate_sub_keys Or %key_all_access, hkey) = %error_success Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sleep(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'sizeof(zname)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sizeof(zclass)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If regenumkeyex(hkey, dwindex, ByVal VarPtr(zname), %max_path, %null, zclass, %max_path, lastwritetime) = %error_success Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Trim&#36;(zstartsubkey) = "" Then<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve shivelist(lhivelistcount)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shivelist(lhivelistcount) = zname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr lhivelistcount<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** do a recursive search for more 'local' entries...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enumregsubkeys hivekey, zname<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve shivelist(lhivelistcount)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shivelist(lhivelistcount) = zstartsubkey &amp; "&#92;" &amp; zname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr lhivelistcount<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** do a recursive search for more 'global' entries...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enumregsubkeys hivekey, zstartsubkey &amp; "&#92;" &amp; zname<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** update index<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Incr dwindex<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Loop<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regclosekey hkey<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;End If<br />
<br />
End Function<br />
<br />
'------------------------------------------------------------------------------<br />
Sub getregpathstr(ByVal lreghivehandle As Long, ByVal hivekey As Long)<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lcnt As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local sregpathstr As String<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lregpathlen As Long<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** prepare counter and arrays for new data<br />
&nbsp;&nbsp;&nbsp;&nbsp;lhivelistcount = 0<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** setup the treeview handle array<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim reghivehandlelist(0) As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;reghivehandlelist(0) = lreghivehandle<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** setup the registry path string array<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dim shivelist(0)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** get the subkeys for the hive<br />
&nbsp;&nbsp;&nbsp;&nbsp;Call enumregsubkeys(hivekey, "")<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** fill treeview with registry path data from shivelist array<br />
&nbsp;&nbsp;&nbsp;&nbsp;For lcnt = 0 To UBound(shivelist)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** get registry path string<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sregpathstr = shivelist(lcnt)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** get number of keys/nodes in the registry path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lregpathlen = ParseCount(sregpathstr,"&#92;")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If lregpathlen &lt; 1 Then lregpathlen = 1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** prepare array for the new treeview item handle<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReDim Preserve reghivehandlelist(lregpathlen)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' ** insert registry path item into treeview and update reghivehandlelist<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reghivehandlelist(lregpathlen) = tvinsertitem(hregtreeview, reghivehandlelist(lregpathlen-1), Parse&#36;(sregpathstr,"&#92;",lregpathlen) )<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Next<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;' ** release the arrays<br />
&nbsp;&nbsp;&nbsp;&nbsp;Erase shivelist()<br />
&nbsp;&nbsp;&nbsp;&nbsp;Erase reghivehandlelist()<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ltotalhivecount = ltotalhivecount + lhivelistcount ' can be removed<br />
<br />
End Sub<br />
CallBack Function hdlgproc() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local trect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As rect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' size dialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hroot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhkcr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhkcu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhklm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhku&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static hhkcc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lptv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As nm_treeview Ptr&nbsp;&nbsp;' treeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local lpnmh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As nmhdr Ptr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' treeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static htreeitem&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' treeview, the selected item<br />
&nbsp;&nbsp;&nbsp;&nbsp;Static htime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;As Long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' can be removed<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local ltime1, ltime2 As Long ' can be removed<br />
&nbsp;&nbsp;&nbsp;&nbsp;Select Case CbMsg<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_initdialog<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hroot = tvinsertitem(hregtreeview, 0, computername)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhkcr = tvinsertitem(hregtreeview, hroot, "hkey_classes_root")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhkcu = tvinsertitem(hregtreeview, hroot, "hkey_current_user")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhklm = tvinsertitem(hregtreeview, hroot, "hkey_local_machine")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhku&nbsp;&nbsp;= tvinsertitem(hregtreeview, hroot, "hkey_users")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hhkcc = tvinsertitem(hregtreeview, hroot, "hkey_current_config")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htime = tvinsertitem(hregtreeview, 0, "load time: ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvexpand(CbHndl, %id_reg_treeview, hroot)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postmessage CbHndl, %wm_user + 1000, 0, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_user + 1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvsettext(CbHndl, %id_reg_treeview, hroot, "reading registry... ")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltime1 = Timer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhkcr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhkcr, %hkey_classes_root)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhkcu)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhkcu, %hkey_current_user)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhklm)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhklm, %hkey_local_machine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhku)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhku, %hkey_users)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hhkcc)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Call getregpathstr(hhkcc, %hkey_current_config)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ltime2 = Timer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tvsettext(CbHndl, %id_reg_treeview, htime, "load time: " &amp; Format&#36;(ltotalhivecount) &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " registry keys in " &amp; Format&#36;(ltime2-ltime1) &amp; _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " seconds (" &amp; Format&#36;(ltotalhivecount &#92; (ltime2-ltime1)) &amp; " keys/sec)" ) ' can be removed<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvsettext(CbHndl, %id_reg_treeview, hroot, computername)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, hroot)<br />
&nbsp;&nbsp;&nbsp;&nbsp; Case %wm_notify<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpnmh = CbLParam<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lptv = CbLParam<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Select Case CbCtl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %id_reg_treeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case @lpnmh.code<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case %tvn_selchangingn<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;htreeitem = @lptv.itemnew.hitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dialog Set Text CbHndl, &#36;Spc &amp; tvgetfullpath(CbHndl, %id_reg_treeview, htreeitem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %tvn_itemexpanded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htreeitem = @lptv.itemnew.hitem<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvselectitem(CbHndl, %id_reg_treeview, htreeitem)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function = 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit Function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case %wm_command<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Select Case CbCtl<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Case %idcancel<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CbCtlMsg = %bn_clicked Then Dialog End CbHndl, 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getclientrect CbHndl, trect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;movewindow(hregtreeview, 1, 1, trect.nright-2, trect.nbottom-2, 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Case %wm_destroy<br />
&nbsp;&nbsp;&nbsp;&nbsp;End Select<br />
End Function<br />
Function PBMain() As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Local hdlg As Long<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dialog New Pixels, 0, "registry to treeview",,, 400, 300, %ws_child Or %ws_sysmenu Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%ws_maximizebox Or %ws_minimizebox Or %ws_caption Or %ws_thickframe To hdlg<br />
&nbsp;&nbsp;&nbsp;&nbsp;Control Add "systreeview32", hdlg, %id_reg_treeview, "", 0, 0, 0, 0, _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%ws_child Or %ws_visible Or %tvs_hasbuttons Or %tvs_haslines Or _<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%tvs_linesatroot Or %tvs_showselalways, %ws_ex_clientedge<br />
&nbsp;&nbsp;&nbsp;&nbsp;Control Handle hdlg, %id_reg_treeview To hregtreeview<br />
&nbsp;&nbsp;&nbsp;&nbsp;Dialog Show Modal hdlg Call hdlgproc<br />
End Function</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[اطلاعات Header فایل های PE]]></title>
			<link>https://www.iranled.com/forum/thread-11601.html</link>
			<pubDate>Tue, 03 Feb 2009 18:36:52 +0000</pubDate>
			<guid isPermaLink="false">https://www.iranled.com/forum/thread-11601.html</guid>
			<description><![CDATA[اینم یکی از سورسهای بسیار خوب و آموزشی در عین حال ساده در پاوربیسیکه که یک اطلاعات کلی<br />
<br />
درباره Header یک فایل PE در اختیار ما می ذاره <br />
<br />
البته کامل نیست چون مثلا خوده Image_Optional_Header32_Struct اطلاعات زیادی داره که<br />
<br />
توی این برنامه فقط مهمترین هاش رو نمایش می ده اما خودتون اگه به ساختار این هدر آشنا باشید<br />
<br />
می تونید برنامه رو کامل کنید<br />
<br />
البته من هم در آینده یه برنامه برای کار با فایلهای PE می ذارم که وقتی سورس همین برنامه ها<br />
<br />
رو ببینید می فهمید نوشتن همچین برنامه هایی اصلا سخت نیست<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/image.gif" title="JPEG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2147" target="_blank">peheaders.JPG</a> (اندازه:  45.81 KB / تعداد دفعات دریافت:  112)
<!-- end: postbit_attachments_attachment --><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2148" target="_blank">PEHeader.zip</a> (اندازه:  4.77 KB / تعداد دفعات دریافت:  243)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[اینم یکی از سورسهای بسیار خوب و آموزشی در عین حال ساده در پاوربیسیکه که یک اطلاعات کلی<br />
<br />
درباره Header یک فایل PE در اختیار ما می ذاره <br />
<br />
البته کامل نیست چون مثلا خوده Image_Optional_Header32_Struct اطلاعات زیادی داره که<br />
<br />
توی این برنامه فقط مهمترین هاش رو نمایش می ده اما خودتون اگه به ساختار این هدر آشنا باشید<br />
<br />
می تونید برنامه رو کامل کنید<br />
<br />
البته من هم در آینده یه برنامه برای کار با فایلهای PE می ذارم که وقتی سورس همین برنامه ها<br />
<br />
رو ببینید می فهمید نوشتن همچین برنامه هایی اصلا سخت نیست<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/image.gif" title="JPEG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2147" target="_blank">peheaders.JPG</a> (اندازه:  45.81 KB / تعداد دفعات دریافت:  112)
<!-- end: postbit_attachments_attachment --><br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://www.iranled.com/forum/images/attachtypes/zip.gif" title="Zip File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="https://www.iranled.com/forum/attachment.php?aid=2148" target="_blank">PEHeader.zip</a> (اندازه:  4.77 KB / تعداد دفعات دریافت:  243)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>