একটি ডিএলএল ফাইল সংযোগ ঘটতে পারে পরোক্ষভাবে এ কম্পাইল লিংক সময়, বা স্পষ্টভাবে রান টাইম এ। যে কোনও উপায়ে, ডিএলএল প্রসেসের মেমরি স্পেসে লোড হয়ে যায় এবং এর রফতানি হওয়া সমস্ত এন্ট্রি পয়েন্ট অ্যাপ্লিকেশনটিতে উপলব্ধ।
যদি রান সময়ে স্পষ্টভাবে ব্যবহৃত, আপনি ব্যবহার LoadLibrary()
এবং GetProcAddress()
নিজে থেকে ডিএলএল লোড এবং ফাংশন আপনাকে কল করার প্রয়োজন পয়েন্টার পেতে।
প্রোগ্রামটি তৈরির সময় যদি স্পষ্টভাবে সংযুক্ত থাকে, তবে প্রোগ্রামটি দ্বারা ব্যবহৃত প্রতিটি ডিএলএল রফতানির জন্য স্টাবগুলি আমদানি গ্রন্থাগার থেকে প্রোগ্রামের সাথে যুক্ত হয়ে যায় এবং প্রসেসটি চালু হওয়ার সাথে সাথে EXE এবং DLL লোড হওয়ার সাথে সাথে সেই স্টাবগুলি আপডেট হয়ে যায়। (হ্যাঁ, আমি এখানে একটু বেশিই সরলীকরণ করেছি ...)
সেই নিবন্ধসমূহ কোথাও থেকে আসা প্রয়োজন, এবং মাইক্রোসফট টুল চেন তারা একটি নামক .LIB ফাইলের একটি বিশেষ ফর্ম থেকে আসা আমদানি গ্রন্থাগার । প্রয়োজনীয় .LB সাধারণত ডিএলএল একই সময়ে নির্মিত হয় এবং এতে ডিএলএল থেকে রফতানি প্রতিটি ফাংশনের স্টাব থাকে।
বিভ্রান্তিমূলকভাবে, একই লাইব্রেরির একটি স্ট্যাটিক সংস্করণটিও একটি এলআইবি ফাইল হিসাবে প্রেরণ করা হবে। এগুলিকে আলাদা করার কোনও তুচ্ছ উপায় নেই, ডিএলএলগুলির জন্য আমদানি গ্রন্থাগারগুলি এলআইবিগুলি সাধারণত মেলা স্ট্যাটিক এলআইবির তুলনায় ছোট (প্রায়শই অনেক ছোট) হবে except
ঘটনাক্রমে আপনি যদি জিসিসি সরঞ্জামচেন ব্যবহার করেন তবে আপনার ডিএলএলগুলির সাথে ম্যাচ করার জন্য আপনার আসলে আমদানি গ্রন্থাগারগুলির প্রয়োজন নেই। উইন্ডোতে পোর্ট করা জ্ঞানু লিঙ্কারের সংস্করণটি সরাসরি ডিএলএল বোঝে এবং ফ্লাইয়ের যে কোনও প্রয়োজনীয় স্টাব সংশ্লেষ করতে পারে।
হালনাগাদ
সব বাদাম এবং বল্টু আসলেই কোথায় এবং সত্যই কী চলছে তা জেনে আপনি যদি প্রতিরোধ করতে না পারেন তবে এমএসডিএন-তে সবসময় সাহায্য করার জন্য কিছু থাকে। ম্যাট পিট্রেকের নিবন্ধটি উইন 32 পোর্টেবল এক্সিকিউটেবল ফাইল ফর্ম্যাটের একটি অন-গভীরতার দিকে নজর দেওয়া EXE ফাইলের ফর্ম্যাট এবং এটি কীভাবে লোড হবে এবং কীভাবে চালিত হবে তার একটি সম্পূর্ণ সম্পূর্ণ পর্যালোচনা। এটি মূলত এমএসডিএন ম্যাগাজিন সিএ-তে প্রকাশিত হওয়ার পরে এটি নেট কভার করে আপডেট করা হয়েছে updated 2002।
এছাড়াও, কোনও প্রোগ্রাম দ্বারা কী কী ডিএলএল ব্যবহার করা হয় তা কীভাবে শিখতে হয় তা জানতে সহায়ক হতে পারে। তার জন্য সরঞ্জামটি নির্ভরতা ওয়াকার, ওরফে depend.exe। এর একটি সংস্করণ ভিজ্যুয়াল স্টুডিওতে অন্তর্ভুক্ত করা হয়েছে তবে সর্বশেষতম সংস্করণটি তার লেখকের http : //www.d dependencywalker.com/ এ উপলব্ধ । এটি লিংক সময়ে নির্দিষ্ট করা সমস্ত ডিএলএল সনাক্ত করতে পারে (প্রারম্ভিক লোড এবং বিলম্ব বোঝা উভয়ই) এবং এটি প্রোগ্রামটি চালাতে এবং রান সময়ে এটি অতিরিক্ত লোড হওয়া কোনও অতিরিক্ত ডিএলএলগুলির জন্য নজর রাখতে পারে।
আপডেট 2
আমি পুনরায় পড়ার উপর এটি স্পষ্ট করতে এবং এমএসডিএন এর সাথে সামঞ্জস্য করার জন্য শিল্পের অন্তর্নিহিত এবং স্পষ্টত লিঙ্কের শর্তাদি ব্যবহার করতে পূর্ববর্তী কিছু পাঠ্য লিখেছি ।
সুতরাং, আমাদের কাছে তিনটি উপায় রয়েছে যে কোনও প্রোগ্রামের দ্বারা ব্যবহারের জন্য গ্রন্থাগার ফাংশনগুলি উপলব্ধ করা যেতে পারে। সুস্পষ্ট ফলোআপ প্রশ্নটি তখন: "আমি কীভাবে নির্বাচন করব?"
স্ট্যাটিক লিঙ্কিং হ'ল কীভাবে প্রোগ্রামটির স্বয়ংক্রিয়ভাবে লিঙ্ক হয়। আপনার সমস্ত অবজেক্ট ফাইল তালিকাবদ্ধ রয়েছে এবং লিঙ্কার দ্বারা EXE ফাইলে একত্রিত হন। পথে, লিঙ্কার গ্লোবাল প্রতীকগুলির রেফারেন্সগুলি ঠিক করার মতো ছোট ছোট কাজগুলি যত্ন করে যাতে আপনার মডিউলগুলি একে অপরের কার্যকারিতা কল করতে পারে। গ্রন্থাগারগুলিও স্থিতিশীলভাবে সংযুক্ত করা যেতে পারে। লাইব্রেরিটি তৈরি করা অবজেক্ট ফাইলগুলি একটি লাইব্রেরিয়ান দ্বারা একটি .LIB ফাইলে সংগ্রহ করা হয় যা লিঙ্কার প্রতীকযুক্ত মডিউলগুলির জন্য অনুসন্ধান করে যা প্রয়োজনীয়। স্ট্যাটিক লিঙ্কিংয়ের একটি প্রভাব হ'ল প্রোগ্রাম দ্বারা ব্যবহৃত গ্রন্থাগার থেকে কেবল সেই মডিউলগুলিই এর সাথে যুক্ত; অন্যান্য মডিউল উপেক্ষা করা হয়। উদাহরণস্বরূপ, Cতিহ্যবাহী সি গণিত লাইব্রেরিতে অনেকগুলি ত্রিকোনমিতি ফাংশন অন্তর্ভুক্ত রয়েছে। তবে আপনি যদি এর বিপরীতে লিঙ্ক করেন এবং ব্যবহার করেনcos()
, আপনার জন্য একটি কোড কপি দিয়ে শেষ হবে না sin()
বা tan()
যদি না আপনি সেই ফাংশন বলা হয়। বৈশিষ্ট্যগুলির সমৃদ্ধ সেট সহ বৃহত্তর গ্রন্থাগারগুলির জন্য, মডিউলগুলির এই নির্বাচনী অন্তর্ভুক্তি গুরুত্বপূর্ণ। এম্বেড থাকা সিস্টেমের মতো অনেক প্ল্যাটফর্মে, লাইব্রেরিতে ব্যবহারের জন্য উপলব্ধ কোডের মোট আকার ডিভাইসে এক্সিকিউটেবল সঞ্চয় করার জন্য উপলব্ধ জায়গার তুলনায় বড় হতে পারে। নির্বাচনী অন্তর্ভুক্তি ব্যতীত plat প্ল্যাটফর্মগুলির জন্য বিল্ডিং প্রোগ্রামগুলির বিশদটি পরিচালনা করা আরও কঠিন।
তবে চলমান প্রতিটি প্রোগ্রামে একই লাইব্রেরির অনুলিপি থাকা কোনও সিস্টেমে বোঝা তৈরি করে যা সাধারণত প্রচুর প্রক্রিয়া চালায়। সঠিক ধরণের ভার্চুয়াল মেমরি সিস্টেমের সাথে, মেমরির যে পৃষ্ঠাগুলিতে অভিন্ন সামগ্রী রয়েছে সেগুলি কেবল সিস্টেমে একবারে উপস্থিত থাকে তবে অনেকগুলি প্রক্রিয়া দ্বারা এটি ব্যবহার করা যেতে পারে। এটি সম্ভাবনা বাড়ানোর জন্য একটি সুবিধা তৈরি করে যে কোডযুক্ত পৃষ্ঠাগুলি যতগুলি সম্ভব চলমান অন্যান্য চলমান প্রক্রিয়াতে কোনও পৃষ্ঠার সাথে অভিন্ন হওয়ার সম্ভাবনা রয়েছে। তবে, যদি প্রোগ্রামগুলি স্ট্র্যাটিকভাবে রানটাইম লাইব্রেরির সাথে লিঙ্ক করে থাকে, তবে প্রতিটিটিতে বিভিন্ন স্থানে মেমরি মানচিত্র প্রক্রিয়াকরণের প্রতিটি বিচ্ছিন্ন ফাংশনগুলির মিশ্রণ রয়েছে এবং এটি কোনও প্রোগ্রাম না হলে অনেকগুলি শেরেবল কোড পৃষ্ঠা থাকে না যদি না এটি নিজে থেকে সমস্ত হয় is প্রক্রিয়া বেশি চালানো। সুতরাং একটি ডিএলএল ধারণাটি আরেকটি, প্রধান, সুবিধা অর্জন করেছিল।
গ্রন্থাগারের জন্য একটি ডিএলএল এর সমস্ত ফাংশন ধারণ করে, যে কোনও ক্লায়েন্ট প্রোগ্রাম দ্বারা ব্যবহারের জন্য প্রস্তুত। যদি অনেক প্রোগ্রাম সেই ডিএলএল লোড করে তবে তারা সকলেই এর কোড পৃষ্ঠাগুলি ভাগ করতে পারে। সবাই জিতল। (ঠিক আছে, যতক্ষণ না আপনি নতুন সংস্করণ সহ একটি ডিএলএল আপডেট করেন, তবে এটি এই গল্পের অংশ নয় Google গুগল ডিএলএল হেলথ টেল অফ কাহিনীর জন্য))
সুতরাং কোনও নতুন প্রকল্পের পরিকল্পনা করার সময় প্রথম বড় পছন্দটি হ'ল গতিশীল এবং স্থির যোগসূত্রের মধ্যে। স্ট্যাটিক লিঙ্কেজের সাহায্যে আপনার কাছে ইনস্টল করার জন্য কম ফাইল রয়েছে এবং আপনি ব্যবহার করেন এমন কোনও ডিএলএল আপডেট করে তৃতীয় পক্ষগুলি থেকে আপনি রেহাই পাবেন। তবে, আপনার প্রোগ্রামটি বৃহত্তর, এবং এটি উইন্ডোজ বাস্তুতন্ত্রের পক্ষে যথেষ্ট ভাল নাগরিক নয়। গতিশীল সংযোগের সাথে, আপনার ইনস্টল করার জন্য আরও ফাইল রয়েছে, আপনার ব্যবহৃত কোনও ডিএলএল আপডেট করার কোনও তৃতীয় পক্ষের সাথে সমস্যা থাকতে পারে তবে আপনি সাধারণত সিস্টেমের অন্যান্য প্রক্রিয়ার সাথে বন্ধুত্বপূর্ণ হয়ে উঠছেন।
একটি ডিএলএল এর একটি বড় সুবিধা হ'ল এটি মূল প্রোগ্রামটি পুনরায় সংবিধান বা এমনকি সংযুক্ত না করে লোড এবং ব্যবহার করা যেতে পারে। এটি কোনও তৃতীয় পক্ষের গ্রন্থাগার সরবরাহকারীকে (উদাহরণস্বরূপ মাইক্রোসফ্ট এবং সি রানটাইম মনে করুন) তাদের লাইব্রেরিতে একটি বাগ ঠিক করতে এবং এটি বিতরণ করার অনুমতি দিতে পারে। শেষ ব্যবহারকারী যখন আপডেট হওয়া ডিএলএল ইনস্টল করেন, তারা তত্ক্ষণাত সেই ডিএলএল ব্যবহার করে এমন সমস্ত প্রোগ্রামগুলিতে সেই বাগ বাগের সুবিধা পাবেন। (যদি না এটি জিনিসগুলি না ভাঙে তবে ডিএলএল হেল্প দেখুন।)
অন্য সুবিধাটি অন্তর্নিহিত এবং সুস্পষ্ট লোডের মধ্যে পার্থক্য থেকে আসে। আপনি যদি স্পষ্টভাবে লোড করার অতিরিক্ত প্রচেষ্টাতে যান তবে প্রোগ্রামটি লেখা ও প্রকাশিত হওয়ার পরে ডিএলএল উপস্থিত থাকতে পারে না। উদাহরণস্বরূপ এটি এক্সটেনশন পদ্ধতিগুলি আবিষ্কার করতে এবং প্লাগিনগুলি লোড করতে পারে।
lib /list xxx.lib
এবংlink /dump /linkermember xxx.lib
। দেখুন এই স্ট্যাক ওভারফ্লো প্রশ্ন ।