PDA

View Full Version : سوال: نحوه طراحی نرم افزار ساخت پرینتر مجازی



saleh313k
سه شنبه 11 بهمن 1390, 13:21 عصر
با سلام خدمت دوستان

من میخوام یه نرم افزار طراحی کنم که مثل نرم افزار هایی که PDF رو می سازند کار کنه و هرجا پرینت گرفته بشه بتونن اون محیط رو به یه پسوند خاص(که ما تعیین میکنیم نه کاربر) تبدیل کنه.
اگر کسی تا بحال این کارو انجام داده و یا میتونه من رو راهنمایی کنه خیلی ممنون میشم به تاپیک من جواب بده.
در ضمن محیطی که من کار میکنم سی شارپ هستش و با Visual Studio 2010 کار میکنم.
منتظرم ، ممنون

Esmail Solhkhah
جمعه 14 بهمن 1390, 01:28 صبح
راه اصولیش اینه که باید برا این کار یه درایور بنویسید

اما درایور نویسی (کمی تا نیمه ابری) سخته و با زبانهای دات نت نمیشه درایور نوشت باید برید سراغ زبانهای Native

اسمبلی - C - دلفی ( هر چند بهترین حالت C هست و اسمبلی کار زیادتری میبره)

میتونید WDK مایکروسافت رو یه نیمه نیگا بندازید ببینید چه خبره

http://www.microsoft.com/download/en/details.aspx?id=11800

حدود 650 مگ هستش و شامل تمام ابزارهای لازمه برای نوشتن و تست درایور هست

این سایت هم یه مرجع هست تو زمینه درایور نویسی و برنامه های سیستمی

www.osronline.com (http://barnamenevis.org/www.osronline.com)

و اما درایور:

بصورت ساده یه فایل اجرایی که تو فاز لود سیستم عامل لود میشه و میتونه تو دو سطح یوزر یا کرنل کار کنه،درایور های سطح کرنل قدرت نامحدودی تو دسترسی به سخت افزار دارن

میشه گفت عملا جزئی از سیستم عامل بشمار میرن ، معمولا با پسوند sys هستند ، سرویسهای ویندوز هم تقریبا یه شباهتهایی با درایورها دارن (جفتشون یجور مدیریت میشن)

برنامه هایی که ما مثلا با C++‎ یا دلفی مینویسیم (Native)یا برنامه هایی که با پلتفرم دات نت مینویسیم تو بالاترین لایه ویندوز اجرا میشن

(User Mode) در نتیجه جهت دسترسی به سخت افزار مجبورن از لایه های پایین تر عبور کنن اونجاس که تازه با آقایون مدیر (Memoey- IO - Security , ...)

باید سلام علیکی بکنن ببینن اجازه دارن برن پایین یا بهشون گفته میشه (ورود خروس ممنوع) شما اینجا باش هرچی خاستی بگو من ببینم میتونم برات بیارم یا باید بیخیالش بشی

و اونچه ما میگیم درسته.

ولی درایور های سطح هسته خودشون همون پایین پایینا کنار این آقایون مدیر هستن و دوستی خوبی با جناب HAL دارن (Hardware abstraction Layer)

http://en.wikipedia.org/wiki/Hardware_abstraction

لایه HAL آخرین لایه سیستم عامل هست که سیستم عامل رو از سخت افزار جدا میکنه مثل همون لایه DAL خودمون

خب تا اینجا گفتیم که دایور هم یه فایل اجرایی هست ولی به یه شکل دیگه پس اگه فایل اجرایی هست

چطوری اجرا میشه خب همین برنامه هایی که با رفیق C#‎ مینویسیم رو نیگا کنید

میبینید همیشه یه متد Main داره که نقطه آغاز برنامس چون سیستم عامل بیچاره از این همه کد شلوغ پلوغ باید یه جاشو بگیره به عنوان نقطه آغازی برنامه و از اونجا کد رو اجرا کنه

قبلنا ORG 100 برامون خیلی آشنا بود (یادش بخیر)

درایور ها هم یه نقطه شروع دان

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DbgPrint("My First Driver\n");
return STATUS_SUCCESS;
}

این برای شروع درایور که کلمه My First Driver رو موقع لود درایور نشون میده (البته مثل Console Application نباید انتظار اون صفحه سیاه رو داشته باشید)

با استفاده از Dbgview.exe باید تعاملات درایور رو ببینید ، برا نصب و اینیت و لود درایور هم فعلا میتونید از osrloader.exe استفاده کنید.

حالا میرسیم به کامپایل و ساخت فایل SYS

یه فایل درست کنید بنام مثلا MyDriver.c

با این کد

#include <ntddk.h>

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DbgPrint("My First Driver\n");
return STATUS_SUCCESS;
}

کدها رو به زبان C++‎ نوشتم دوست داشتید از اسمبلی استفاده کنید و خودتونو بیچاره کنید

یه فایل دیگه درست میکنید بنام makefile بدون پسوند شامل

!INCLUDE $(NTMAKEENV)\makefile.def

یه فایل دیگه درست میکنید بنام Sources بدون پسوند شامل

TARGETNAME = MyDriver
TARGETPATH = obj
TARGETTYPE = DRIVER
INCLUDES = %BUILD%\inc
LIBS = %BUILD%\lib
SOURCES = MyDriver.c

اینجا MyDriver.c همون فایلی هست که تو مرجله اول ساختید و شامل سورس درایورتون هس ، همه این سه فایل رو بریزید تو یه مسیر ساده مثلا

D:\MyDriver

بعد با فرض نصب WDK از استارت منو Windows Driver Kit رو پیدا کنید و از زیر شاخه WDK مربوطه

x86 Checked Build Environment رو اجرا کنید و به مسیر D:\MyDriver برید

بعد بنویسید Build

منظر بمونید تا کار بیلد تموم بشه اگه کدتون مورد نداشته باشه کامپایل میشه و تو همون مسیر میبینید یکی دو تا فولدر ایجاد شد از فولدر obj میتونید درایور ساخته شده رو پیدا کنید

بعد با osrloader.exe نصب و اینیت و لودش کنید

حواستون باشه کوچکترین اشتباهی ممکنه باعث BSOD بشه

http://en.wikipedia.org/wiki/Blue_Screen_of_Death

اینجا دیگه سی شارپ نیس با یه اکسپشن ساده و کلوز قضیه رو رفع و رجوع کنیم

اینا تازه مثل اینه که شما تو سی شارپ همون Hello World مرسوم رو بعنوان اولین برنامه نوشتید

این همه داستان راستان گفتم تا بدونید اگه خودتون بخاید یه پرینتر مجازی بنویسید که کار پرینت به PDF یا عکس یا هر کوفت و زهر مار دیگه ای رو انجام بده واقعا باید وقت بذارید

همین کار رو وقتی که میخای روش بذاری مثل یادگرفتن کل سی شارپ با مخلفاتش در نظر بگیر شایدم بیشتر

چون اینجا مجبوری C++‎ یاد بگیری ، با ساختار سیستم عامل های خانواده NT آشنا باشی و تازه شروع کنی با WDK کار کردن

قصدم مایوس کردن شما نیس خاستم عمق فاجعه رو نشون بدم :چشمک:

کلک مرغابی هم میشه سوار کرد اما به شرطها و شروطها

موفق باشید.

saleh313k
جمعه 21 بهمن 1390, 21:50 عصر
واقعا ممنون،
من واسه یه کار تجاری بزرگ میخاستم این کارو انجام بدم و اگه ببینم ارزششو داره حتما تا تهش میرم جلو، اما این شما بودین که سرخط به من دادید و واقعا از شما ممنونم
ایشاله موفق باشین!!:قلب:

Esmail Solhkhah
یک شنبه 23 بهمن 1390, 03:18 صبح
واقعا ممنون،
من واسه یه کار تجاری بزرگ میخاستم این کارو انجام بدم و اگه ببینم ارزششو داره حتما تا تهش میرم جلو، اما این شما بودین که سرخط به من دادید و واقعا از شما ممنونم
ایشاله موفق باشین!!:قلب:شما لطف داید دوست عزیز

برا این کارتون یه سری توضیحات میدم امیدوارم مفید واقع بشه

اول اینکه تو سیستم عامل های خانواده NT به دلیل امنیت دسترسی فیزیکی به سخت افزاز وجود نداره و چاپگر هم خارج از این قاعده نیست

اینجاس که بحث چاپگرهای مجازی به میون میاد ،وقتی شما یه پرینت به پرینتر میفرستید (Job) در حقیقت دارید این پرینت رو به چاپگر مجازی میفرستید

(دقت کنید که آیکونهای پرینتر هایی رو که تو سیستم عامل میبینید در حقیقت همون چاپگرهای مجازی هستن)

کار چاپ به چاپگر مجازی فرستاده میشه و این چاپگر مجازیه که کار چاپ رو به چاپگر فیزیکی میفرسته و این کار رو با استفاده از درایور انجام میده

این بابا درایور دسترسی به سخت افزار رو از سیستم عامل اجازه داره

حالا شما میاید و مثلا تو تنظیمات چاپگر میگید برگه ها پیش فرض A5 چاپ شن

آیا این تنظیم رو دارید مستقیم رو چاپگر انجام میدید ؟ مطابق بحثی که داشتیم نه

بلکه این چاپگر مجازیه که داره این تنظیمات رو بصورت کامندهای داخلی چاپگر براش میفرسته

چاپگرها دارای کامندهای داخلی هستن (حتی شما میتونید با استفاده از یه اینترفیس سخت افزاری طراحی شده توسط خودتون با چاپگر کار کنید و نیاز به PC هم نداشته باشید)

بیشتر تجهیزات جانبی کامپیوتر از هارد گرفته تا فلاپی دیسک و همین فلش دیسک ها و پرینتر ها و اسکنر ها داخلشون معمولا یه دونه یا چند تا

میکروکنترلر هست که وظیفه ارتباط سخت افزار مربوطه رو با بیرون داره و برای این ارتباط یه سری استانداردهایی دارن که شما با داشتن این

استانداردها میتونید اون قطعه رو خودتون مدیریت کنید ، یه مثال میزنم همین هارد اکسترنال چطوری به گیرنده های دیجیتال (یا دستگاههای تجهیزات شیطان :قهقهه:) وصل میشه؟

داخل گیرنده که PC نیست ، خب اونجا هم یه میکرو کنترلر هست که با این قطعه از طریق کامندهای داخلی ارتباط برقرار کرده و داده ها رو ارسال و دریافت میکنه


بگذریم وقتی شما دارید یه فایل رو پرینت میکنید مثلا یه فایل Word با زدن دکمه پرینت یه همچین چیزایی پس پرده و تو دل و روده ویندوز داره اتفاق می افته :


برنامه میاد و GDI (http://en.wikipedia.org/wiki/Graphics_Device_Interface) ویندوز رو فراخونی میکنه و جناب GDI هم درایور مربوطه چاپگر رو فراخونی میکنه این دو با هم میان و از اطلاعات فایل فرستاده شده (همون فایل Word)

یه فایل EMF (http://whatis.techtarget.com/definition/0,,sid9_gci213583,00.html) میسازن ساختار فایل EMF رو میتونید با کد نویسی مدیریت کنید تو این تاپیک(حذف شده) توضیح دادم (این قسمت رو تو پاورقی توضیح میدم ، فعلا باشه پاورفی 1)

این فایل EMF شامل فراخوانیهای GDI و اصلاعات درایور مربوطه هست

بعد این داستان، برنامه میاد و اسپولر رو فراخونی میکنه

این بابا اسپولر Job رو میگیره و تو هارد ذخیره میکنه (یه جورایی پرینتها دارن کش میشن)

شما میتونید مسیر این فایلها رو تغییر بدید ( این قضیه رو هم تو این تاپیک توضیح داده بودم که حذف شده ، مراجعه شود به پاورقی)

به ازای هر Job ما معمولا دو تا فایل داریم

1:فایلهای اسپولر با پسوند spl که همون فایل اصلی اسپول حساب میشه و حاوی اصلاعات پرینت درخواستی ما هست

2:فایلهای سایه با پسوند shd که شامل اولویت Job - نام کاربر فرستنده - نام سیستم فرستنده و یه سری کوفت و زهر مار دیگس

سرویس اسپولر رو میتونید تو سرویسهای ویندوز (Spooler) پیدا کنید



کلک مرغابی که میگفتم همینه (Spooler) امیدوارم گرفته باشید دیگه جزئیات پیاده سازی یه پرینتر مجازی با این اسپولر با خودتون

(ای بابا من که کل ماجرا رو لو دادم ، ولی مهم نیس شما پیادش کنید بذارید اینجا ما هم دعاتون میکنم حتی به خودمون زحمت نمیدیم یه دکمه تشکر براتون بزنیم)


پاورقی 1 : اون پست رو حذفش کردن اگه علاقه مند بودید میتونم اونا رو هم توضیح بدم


موفق باشید.

Esmail Solhkhah
یک شنبه 23 بهمن 1390, 17:40 عصر
یه پروژه اپن سورس خوب هم تو این زمینه هست حتما بررسیش کنید

http://www.pdfforge.org/download

این لینک رو گذاشتم تا دوستانی که تو این مورد میخان کار کنن دیگه زیاد به عمو گوگل زحمت ندن

vof.ir
چهارشنبه 30 فروردین 1391, 16:44 عصر
جناب صلح خواه امکانش هست اون مواردی که فرمودید حذف شدند را توضیح بفرمایید؟
ممنونم

Esmail Solhkhah
یک شنبه 07 خرداد 1391, 22:42 عصر
جناب صلح خواه امکانش هست اون مواردی که فرمودید حذف شدند را توضیح بفرمایید؟
ممنونم

میثم جان شرمنده دیر جواب دادم، یه مدتیه گرفتارم شدید.

چون میدونم با رفرنسهای خارجی موردی ندارید لینک میزارم .

http://www.undocprint.org/winspool/spool_files

http://www.codeproject.com/Articles/10586/EMF-Printer-Spool-File-Viewer

موفق باشید.

bkamran
جمعه 10 آذر 1391, 23:15 عصر
سلام
از دوستان عزیز که مطلع هستند خواهش میکنم جواب بدن
من میخوام اطلاعاتی که از 7 کامپیوتر بر روی یک پرینتر چاپ میشه رو قبل از چاپ به صورت فایل اکسل ذخیره کنم
میشه لطفا منو راهنمایی کنین که چطوری میتونم شروع کنم؟
باید برنامه بنویسم یا نرم افزاری هست که بتونم ازش کمک بگیرم؟
ممنون میشم

Esmail Solhkhah
سه شنبه 14 آذر 1391, 11:25 صبح
سلام

پست 2 و مخصوصا پست 4 رو کامل بخونید ، یه روش رو توضیح دادم.

موفق باشید.