PDA

View Full Version : ساخت فايل Dll



hero4000
دوشنبه 23 فروردین 1389, 17:31 عصر
سلام بر همه دوستان

من برنامه نويس Vb هستم حالا توي برنامم ميخوام از يک دي ال ال استفاده کنم که تحت Vc++ يا c# نوشته بشه

ولي اصلا اينها رو بلد نيستم

اگه دوستان زحمت بکشن راهنمائي کنن ممنون ميشم

ساختار تابع به صورت زير است


Private Declare Function Str Lib "Str.dll" (ByVal n As Integer, ByVal lpBuffer As String) As Long

راستي متغير lpBuffer باز گشتي (يعني مقداري که توي فايل دي ال ال رو ميگيره بايد حفظ کنه )


از همه شما کمال تشکر را دارم

FastCode
دوشنبه 23 فروردین 1389, 18:18 عصر
راستي متغير lpBuffer باز گشتي (يعني مقداري که توي فايل دي ال ال رو ميگيره بايد حفظ کنه )

پس باید از ByRef استفاده کنید.

hero4000
سه شنبه 24 فروردین 1389, 09:50 صبح
دوست عزيز منظور شما کجا بود اگه توي برنامه بيسيکمه که فکر نمي کنم اينطور باشه چون من نمونه هاي ديگه اي به همين شکل استفاده کردم و مشکلي نداشته

مشکل من ساخت فايل دي ال ال هستش

لطفا اگه نمونه برنامه اي کدي چيزي دارين زحمت بکشين

ممنون

Rejnev
سه شنبه 24 فروردین 1389, 10:03 صبح
سلام

file-->newProject-->visual C#‎‎-->Windows-->Class Library

بعد از build پروژه در پوشه bin شما یک dll همنام با پروژه خواهید دید که قابل اضافه کردن به پروژه دات نتیه.
الگوی تابع هم به این شکله.



public long Str(int n, string lpBuffer)
{
//body
return "whatever"
}

hero4000
سه شنبه 24 فروردین 1389, 12:09 عصر
ببخشيد دوست عزيز


اونوقت اين موارد که فرموديد توي ++ Visual C هم کار ميکنه جون من اين برنامه رو دارم

راستي اون پارامتر دوم بازگشتي هستش يعني اگر توي تابع تغيير کنه مقدارش توي برنامه VB من هم تغيير ميکنه

Rejnev
سه شنبه 24 فروردین 1389, 13:17 عصر
ببخشيد دوست عزيز


اونوقت اين موارد که فرموديد توي ++ Visual C هم کار ميکنه جون من اين برنامه رو دارم

راستي اون پارامتر دوم بازگشتي هستش يعني اگر توي تابع تغيير کنه مقدارش توي برنامه VB من هم تغيير ميکنه
یا dll شما تحت دات نت کار میکنه و یا با c++ native نوشته شده و تحت هر جا کار میکنه.
من فکر میکردم منظور شما VB.Net هست.
ظاهرا vb6 منظورتونه که در اینصورت نمیتونید از dll سی شارپ استفاده کنید چون vb، دات نت رو پشتیبانی نمیکنه و باید یا خودتون توی vb و یا c++ دی ال ال رو تولید کنید و در برنامه استفاده کنید.
برای ساخت در vb6 در قسمت انتخاب نوع پروژه ActiveX Dll رو انتخاب کنید و توابع(متدها) خودتون رو در اون بنویسید و در نهایت پروژه رو تبدیل به dll کنید و ازش استفاده کنید.
c++ رو کار نکردم.

hero4000
سه شنبه 24 فروردین 1389, 16:29 عصر
سلام دوست عزيز

نه من ميخوام توي++ VC اين کار رو انجام بدم چون از توابعي بايد استفاده کنم که توي وي بي نيست

لطفا دوستان هر کسي که ميتونه محبت کنه راهنمائي کنه

ممنون

ASKaffash
شنبه 28 فروردین 1389, 08:33 صبح
سلام دوست عزيز

نه من ميخوام توي++ VC اين کار رو انجام بدم چون از توابعي بايد استفاده کنم که توي وي بي نيست

لطفا دوستان هر کسي که ميتونه محبت کنه راهنمائي کنه

ممنون
سلام
من هم VB6 بلدم هم C# بگو در VB6 چکار می خواهی بکنی که محتاج#C شدی ؟

hero4000
شنبه 28 فروردین 1389, 11:57 صبح
Private Declare Function Str Lib "Str.dll" (ByVal n As Integer, ByVal lpBuffer As String) As Long
مرسي دوست عزيز من ميخوام وقتي تابع بالا رو توي وي بي تعريف ميکنم دي ال الي که ساختم (يعني قراره شما راهنمايي کنيد بسازم ) مقدار پارامتر دوم رو تغيير بده و اين تغيير توي برنامه وي بي من انتقال پيدا کنه ( يعني تابع دوم بازگشتي باشه )

متشکرم که حداقل شما توجه کرديد

البته من برنامه C# ندارم برنامه من ويژوال سي ++ هستش

ASKaffash
شنبه 28 فروردین 1389, 14:14 عصر
سلام
این Str.dll به VB نوشته شده است ؟ یا قرار است با #C نوشته شود ؟

hero4000
شنبه 28 فروردین 1389, 14:35 عصر
با ++ VC چون من #C ندارم

ASKaffash
شنبه 28 فروردین 1389, 14:54 عصر
سلام
باید پارامتر دوم را در C++ باید ref تعریف و مقدار ByVal lpBuffer As String را به ByRef تغییر دهید تا این پارامتر از C++ به Vb6 قابل انتقال باشد

hero4000
شنبه 28 فروردین 1389, 18:15 عصر
ببخشيد دوست عزيز من توي يک دي ال ال ديگه که سورسش رو ندارم همين کار رو کردم يعني ByVal تعريف کردم و درست جواب داده ( يعني بازگشتي بوده )


باید پارامتر دوم را در C++‎ باید ref تعریف

اطلاعات من خيلي ناقصه لطفا خود ساختار تابع رو بگين

ممنون

Amir Oveisi
شنبه 28 فروردین 1389, 22:28 عصر
( يعني تابع دوم بازگشتي باشه )

يعني ByVal تعريف کردم و درست جواب داده ( يعني بازگشتي بوده )

دوست گرامی دلیل اینکه شما جواب سوالتون رو نگرفتید (یا دیر گرفتید) هیچکدوم از چیزایی نبود که در پست های پاک شده فرمودید بلکه دلیلش بر می گرده به تعاریف نادرستی که برای بیان صورت مسئله تون استفاده کردید.
من هنوز متوجه منظور شما از لفظ "بازگشتی بودن" نشدم و ارتباط اون رو با ByVal و ByRef هم نفهمیدم.

hero4000
یک شنبه 29 فروردین 1389, 08:07 صبح
من هنوز متوجه منظور شما از لفظ "بازگشتی بودن" نشدم و ارتباط اون رو با ByVal و ByRef هم نفهمیدم
سلام دوست گرامي

شما اگه يک متغير رو به يک تابع بفرستين و تغييراتي که در تابع روي اون متغير اعمال ميشه روي متغير ارسالي شما هم اعمال بشه اونوقت شما به اين متغير چي ميگين

منظور من از بازگشتي همينه

ASKaffash
یک شنبه 29 فروردین 1389, 08:37 صبح
سلام این یک مثال به C :


void g()
{
int y = 0;
f(ref y);
this.Text = y.ToString();
}
void f(ref int x)
{
x++;
}

Amir Oveisi
دوشنبه 30 فروردین 1389, 03:31 صبح
با سلام


به اين متغير چي ميگين
به این متغیر همون متغیر میگن باز هم.


يک متغير رو به يک تابع بفرستين و تغييراتي که در تابع روي اون متغير اعمال ميشه روي متغير ارسالي شما هم اعمال بشه
به این شیوه ارسال پارامتر میگن ارسال با رفرنس (by reference).

و اما بازگشتی (recursive) به توابعی میگن که در داخل خودش، داره خودش رو دوباره فراخوانی (call) میکنه و این دو تا موضوع ارتباطی به هم ندارند.

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

با تشکر، موفق باشبد

hero4000
دوشنبه 30 فروردین 1389, 09:09 صبح
لطفا در بیان مشکلات و سوالات خود دقت بیشتری به خرج دهید تا سریع تر به جواب برسید و در صورت نرسیدن به جواب به جای متهم کردن سایر کاربران و ارسال پست های فاقد محتوا، سوال خود را واضح تر در همان پست مطرح نمایید.

دوست عزيز از شما متشکرم که بنده را آگاه کردين ولي من چندين مرتبه برداشت خودم رو از متغير بازگشتي در پستهاي مختلف توضيح دادم

ولي دوست عزيز من نميدونم چرا توي اين بخش من هر سوالي ميپرسم جواب درست و حسابي نميگيرم

شما هم که زحمت کشيدين بنده را نقد کردين ولي بازهم جوابي ندادين

درضمن من وقتي عبارتي Ref رو توي تعريف متغيرم مينويسم نميدونم چرا موقع کامپايل گير ميده

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

نميدونم مشکل کجاست

باتشکر

ASKaffash
دوشنبه 30 فروردین 1389, 15:31 عصر
سلام
Ref نه ref بزرگ و کوچک فرق می کند

hero4000
سه شنبه 31 فروردین 1389, 12:24 عصر
سلام دوست عزيز

من نميدونم چرا همش به بن بست ميرسم

حروف بزرگ و کوچک هم فرقي نکرد

بازم از همونجا ايراد ميگيره

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

بازم ممنون

ASKaffash
سه شنبه 31 فروردین 1389, 15:18 عصر
سلام دوست عزيز

من نميدونم چرا همش به بن بست ميرسم

حروف بزرگ و کوچک هم فرقي نکرد

بازم از همونجا ايراد ميگيره

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

بازم ممنون
سلام
چه کدی ؟ شما کدتان را قرار دهید به همراه پیام خطا تا اصلاح کنیم

hero4000
یک شنبه 05 اردیبهشت 1389, 07:59 صبح
long _stdcall str(int n , ref char* lpBuffer)
اينهم پيغام خطا
error C2061: syntax error : identifier 'ref'


در ضمن کدي که من ميخوام توي پست اولم گفتم

با تشکر


دوست گرامی دلیل اینکه شما جواب سوالتون رو نگرفتید (یا دیر گرفتید) هیچکدوم از چیزایی نبود که در پست های پاک شده فرمودید بلکه دلیلش بر می گرده به تعاریف نادرستی که برای بیان صورت مسئله تون استفاده کردید.يعني من هنوزم تعريف اشتباهي دارم يا ......:متفکر:

ASKaffash
یک شنبه 05 اردیبهشت 1389, 08:13 صبح
يعني من هنوزم تعريف اشتباهي دارم يا ......:متفکر:
سلام
ظاهرا دستور درست است. نمی دانم چه شده !

Amir Oveisi
یک شنبه 05 اردیبهشت 1389, 14:32 عصر
long _stdcall str(int n , ref char* lpBuffer)
اينهم پيغام خطا
error C2061: syntax error : identifier 'ref'




در ضمن کدي که من ميخوام توي پست اولم گفتم

با تشکر

این کد رو با چه زبانی نوشتید؟

FastCode
یک شنبه 05 اردیبهشت 1389, 17:43 عصر
اولا" _stdcall غلطه.
درستش __stdcall هست.
در ضمن وقتی * داری ref لازم نیست.
long هم اشتباهه.
__int64 درست:گیج:ه.

hero4000
دوشنبه 06 اردیبهشت 1389, 10:41 صبح
این کد رو با چه زبانی نوشتید؟
با vC++

اولا" _stdcall غلطه.
درستش __stdcall هست.
اگه REF رو نزارم همينجوري کار ميکنه پس چجوري ميشه غلط باشه :متفکر:


در ضمن وقتی * داری ref لازم نیست.

من * رو براي تعريف رشته نوشتم چون نميدونم رشته چجوري تعريف ميشه حالا چه ربطي به REF داره نميدونم



long هم اشتباهه.
__int64 درسته.

توي اين قسمت هم مشکلي نيست چون برنامه مقدار رو درست به برنامه وي بي پاس ميده

از توجه شما هم متشکرم

mohsenaskari
سه شنبه 22 اسفند 1391, 21:24 عصر
سلام.
وقتی project type رو activex dll انتخاب می کنم ، ماژول کلاسی که ساختم رو نمی دونم instancing رو چی انتخاب کنم.
لطفا راهنمایی کنید.
ممنون