ورود

View Full Version : سوال: استفاده از Dll در ریسورس



loo30fer
جمعه 14 مرداد 1390, 11:29 صبح
با سلام
من اومدم دوتا Dll رو که برای ارسال ایمیل Indy بودن و هنگام ارسال ازش استفاده میکردن رو به این نام ها libeay و ssleay به ریسورس دادم حالا چطور باید تعریف کنم که هنگام ارسال ایمیل این Dll ها رو از ریسورس من بخونه و هنگام ارسال ازش استفاده کنه؟
خواهشا این سوال بنده رو جواب بدین آخه هرچی سوال میپرسم هیچکی به سوالات من جواب نمیده جز سوالات دیگر دوستان :ناراحت:

سعید صابری
جمعه 14 مرداد 1390, 13:21 عصر
فکر کنم باید اول روی هارد(اکستراکت) ذخیره اش کنی تا بتونی استفاده کنی

loo30fer
جمعه 14 مرداد 1390, 15:08 عصر
اگه اشتباه نکنم باید از کتابخانه IdSSLOpenSSLHeader تو دستور If hIdSSL = 0 Then hIdSSL := LoadLibrary(SSL_DLL_name) else مجبورش کنم که به جای اینکه مقدار SSL_DLL_name که نام دی ال ال ssleay32.dll داده شده که این کتابخانه رو از کنار فایل اجرایی بخونه از ریسورس من اون رو بخونه یعنی اول مانند کد داخل ریسورس پیداش کنم بعد TResourceStream ایجاد کنم و لودش کنم بعد بدمش به LoadLibrary درسته ؟ اگه نه ممنون میشم راهنمایی کنید دیگه خودم رفتم دنبالش فقط راهنمایی شما دوستان مونده پس دریغ نکنید. تشکر
FindResource(hInstance, 'ssleay32', RT_RCDATA);
rs := TResourceStream.Create(hInstance, 'ssleay32', RT_RCDATA);

setroyd
جمعه 14 مرداد 1390, 23:00 عصر
میشه یکم بهتر توضیح بدی

loo30fer
جمعه 14 مرداد 1390, 23:20 عصر
میشه یکم بهتر توضیح بدی
در کدوم قسمت دوست من ؟

joker
شنبه 15 مرداد 1390, 00:41 صبح
مگه خود ابزارهاي دلفي براي ارسال ايميل چه مشكلي دارند ؟!

قراردادن dll در ريسورس راحت ترين حالت اينه كه موقع استفاده اكپسورتشون كني يه جائي روي هارد و ازشون استفاده كني و بعد از استفاده هم حذفشون كني
استفاده مستقيم از داخل ريسورس مستلزم دانش خيلي بالاتري در مورد ساختار فايلها و بارگذاري dll درحافظه هست (‌منم خودم زياد بلد نيستم ، براي همين بهت پيشنهاد نميكنم اين قضيه را دنبالشو بگيري )

loo30fer
شنبه 15 مرداد 1390, 00:55 صبح
مگه خود ابزارهاي دلفي براي ارسال ايميل چه مشكلي دارند ؟!خوب منم دارم از خود ابزار دلفی استفاده میکنم کامپوننت Indy و این دو تا dll هم ابزار کمکی برای ارسال ایمیل هستن که تا این دوتا Dll نباشن کامپوننت indy قادر به ارسال ایمیل نیست.

قراردادن dll در ريسورس راحت ترين حالت اينه كه موقع استفاده اكپسورتشون كني يه جائي روي هارد و ازشون استفاده كني و بعد از استفاده هم حذفشون كني
استفاده مستقيم از داخل ريسورس مستلزم دانش خيلي بالاتري در مورد ساختار فايلها و بارگذاري dll درحافظه هست (‌منم خودم زياد بلد نيستم ، براي همين بهت پيشنهاد نميكنم اين قضيه را دنبالشو بگيري ) منم همین قصد رو دارم ولی اگه نشد مجبورم این dll ها رو تو پوشه Temp بریزم و تو کتابخانه IdSSLOpenSSLHeader تعریف کنم که اون dll ها رو هم از پوشه Temp فراخوانی کنه.
در مورد بارگذاری Dll مشکل چندانی ندارم چون با اینکه 8 ماهه دارم با دلفی کار میکنم و فقط خودم یاد گرفتم و نه کتابی کمکم بوده و نه معلمی یا کلاسی با راهنمایی و جستجو میتونم خدارو شکر اکثر مشکلاتم رو میتونم رفع کنم و فقط در این مورد راهنمایی میخواستم بدونم که باید به چه شکل عمل کنم که این Dll رو تو رم بارگذاری کنم یا اینکه مانند کدی که قرار دادم فقط از تو ریسورس لودش کنم و بدمش به LoadLibray ؟
البته خودم تا به الان خودم روش کار کردم و یه کارایی کردم.

vcldeveloper
شنبه 15 مرداد 1390, 01:37 صبح
و این دو تا dll هم ابزار کمکی برای ارسال ایمیل هستن که تا این دوتا Dll نباشن کامپوننت indy قادر به ارسال ایمیل نیست.
اون دو تا DLL ربطی به ایمیل ندارند. در یک تاپیک دیگه هم توضیح دادم، اونها DLL های مربوط به OpenSSL هستند. SSL یکی از پروتکل های تامین امنیت ارتباطات در اینترنت هست. اگر سروری برای اتصال نیاز به SSL داشته باشه، شما باید از SSL برای ارتباط با اون استفاده کنید. SSL پیاده سازی های مختلفی داره، که یکی از این پیاده سازی ها که اوپن سورس هم هست، OpenSSL هست. indy هم برای استفاده از SSL به OpenSSL رجوع میکنه. برای این کار هم نیاز به DLL های OpenSSL داره، که بتونه توابع مربوطه را از آنها فراخوانی کنه.

پس اون DLL ها زمانی مورد استفاده شما قرار می گیرند که سرور ایمیل شما نیاز به اتصال امن مبتنی بر SSL داشته باشه (مثل GMail). در غیر این صورت، نیازی بهشون نیست.

برای لود کردن DLL از طریق ریسورس، اگر در اینترنت بگردید، باید بتونید نمونه کدهایی پیدا کنید، اما مراحل کار ساده نیست. تابع LoadLibrary همچین قابلیتی رو به شما ارائه نمیده. نمونه کدهایی هم که موجود هستند، در واقع عملکرد LoadLibrary را شبیه سازی می کنند. شبیه سازی این عملکرد هم یعنی اینکه شما باید دانش بالایی در ارتباط با چگونگی کارکرد سیستم عامل ویندوز و ساختار فایل های PE داشته باشید. به طور کلی، این مدل لود کردن DLL چیزی نیست که سیستم عامل ویندوز به طور رسمی پشتیبانی کنه، و راه حل های موجود نوعی هک محسوب میشند.

نیازی هم نیست که بخواید اون DLL ها رو تبدیل به ریسورس کنید. دو تا DLL هستند، نیاز به نصب هم ندارند، همین که در یک مسیری باشند که برنامه بتونه پیداشون کنه، کفایت میکنه. می تونید اونها رو کنار فایل EXE برنامه داشته باشید، یا اینکه در یک پوشه عمومی مثل پوشه Windows یا System32 آنها را موقع نصب برنامه کپی کنید. البته دقت داشته باشید که برنامه های متعددی ممکنه از OpenSSL استفاده کنند، پس ممکنه این DLL ها از قبل در یکی از پوشه های عمومی ویندوز توسط برنامه دیگه ایی کپی شده باشند.

اگر هم جدا با وجود دو تا DLL مشکل دارید (!!)، می تونید به جای Indy به کتابخانه هایی رجوع کنید که برای پیاده سازی SSL از OpenSSL استفاده نمی کنند، و خودشون پیاده سازی مربوطه را انجام میدند؛ اجباری به استفاده از Indy نیست.

loo30fer
شنبه 15 مرداد 1390, 02:22 صبح
از اینکه جواب بنده رو دادین بسیار ممنونم.

تابع LoadLibrary همچین قابلیتی رو به شما ارائه نمیدهیعنی LoadLibrary این قابلیت رو نداره که بشه یک dll رو از ریسورس از تو رم یا مستقیما لود کرد؟ درسته؟

اگر هم جدا با وجود دو تا DLL مشکل دارید (!!)، می تونید به جای Indy به کتابخانه هایی رجوع کنید که برای پیاده سازی SSL از OpenSSL استفاده نمی کنند، و خودشون پیاده سازی مربوطه را انجام میدند؛ اجباری به استفاده از Indy نیست.میتونید در این مورد بیشتر بنده رو راهنمایی کنید مثلا از چه کتابخانه هایی برای پیاده سازی یک ارسال کننده ایمیل استفاده کنم و آیا این ارسال کننده ایمیل رو که من میسازم چه با کمک کتابخانه که شما معرفی میکنید چه با کامپوننت Indy مشکلی در اتصال به سرورهای مجازی برای ارسال ایمیل ندارن یعنی امکان اینکه به مشکلی بربخوره نیست و کلا قوانین ارسال ایمیل به یک شکل هست آدرس سرور و پورت باز سرور مخصوص ارسال ایمیل و یوزر و پسورد ؟

vcldeveloper
شنبه 15 مرداد 1390, 19:13 عصر
یعنی LoadLibrary این قابلیت رو نداره که بشه یک dll رو از ریسورس از تو رم یا مستقیما لود کرد؟ درسته؟
درسته.


مثلا از چه کتابخانه هایی برای پیاده سازی یک ارسال کننده ایمیل استفاده کنم
از هر چی که دوست دارید؛ از توابع اینترنتی ویندوز گرفته، تا کامپوننت هایی مثل IP Works, یا ICS و غیره.


آیا این ارسال کننده ایمیل رو که من میسازم چه با کمک کتابخانه که شما معرفی میکنید چه با کامپوننت Indy مشکلی در اتصال به سرورهای مجازی برای ارسال ایمیل ندارن یعنی امکان اینکه به مشکلی بربخوره نیست و کلا قوانین ارسال ایمیل به یک شکل هست آدرس سرور و پورت باز سرور مخصوص ارسال ایمیل و یوزر و پسورد ؟
ارسال ایمیل بر اساس پروتکل SMTP صورت میگیره. هر چیزی که با این پروتکل سازگار باشه، شما می تونید ازش استفاده کنید.

BORHAN TEC
شنبه 15 مرداد 1390, 21:15 عصر
یعنی LoadLibrary این قابلیت رو نداره که بشه یک dll رو از ریسورس از تو رم یا مستقیما لود کرد؟ درسته؟
البته من یادمه چند وقت پیش با پیدا کردن یک نمونه کد تونستم یک dll رو از یک استریم بارگذاری کنم. که با استفاده از این امکان حتی میشود dll را به صورت کد شده درآورد. در این مورد خاص فکر می کنم که کامپوننت های IP Works بهتر بتونه مشکل شما رو حل کنه.

vcldeveloper
یک شنبه 16 مرداد 1390, 01:44 صبح
البته من یادمه چند وقت پیش با پیدا کردن یک نمونه کد تونستم یک dll رو از یک استریم بارگذاری کنم.
کسی نگفته نمیشه DLL را از حافظه لود کرد، حتی براش نمونه کد هم در اینترنت هست؛ بلکه گفته شد LoadLibrary همچین قابلیتی رو ارائه نمیکنه، و راه حل هایی هم که ارائه شدند، نوعی هک محسوب میشند.


که با استفاده از این امکان حتی میشود dll را به صورت کد شده درآورد.
DLL رو همین الان هم میشه بدون دردسر با استفاده از Compressor ها یا ابزار های Source code obfuscation کد کرد.