# Native Code > برنامه نویسی با C > برنامه نویسی با Borland C++‎ Builder >  SDK Plugin MMB

## loo30fer

با سلام
من چند روزه دارم با Borland سی ++ کار میکنم و میخوام یک پلاگین رو باهاش پیاده کنم که با دلفی براحتی اینکار رو میکنم و SDK رو به دلخواهم تعریف کردم ولی الان میخوام این SDK رو تو ++C پیاده کنم معادلش رو نوشتم ولی نمیدونم چرا وقتی این SDK رو کمپایل میکنم هیچ کدوم از توابع کار نمیکنن؟
من کد SDK ای رو که تو دلفی و ++C رو پیاده کردم رو گذاشتم ممنون میشم کمک کنید و بگین اشکالات من تو کدوم قسمتها هست و به چی باید تغییرش بدم. با تشکر
unit PluginInterface;

interface

uses
  Windows;

procedure SetParentWindow (hwnd: HWND); cdecl;
procedure SetFile(sFile: PChar); cdecl;
procedure SetData(sData: Integer); cdecl;
function GetFile(): PChar; cdecl;
function GetData(): Integer; cdecl;
function Copyright(): PChar; cdecl;
function GetInfo(): PChar; cdecl;
function GetShortInfo(): PChar; cdecl;

var
  TextInput,TextOutput: String;
  NumInput,NumOutput: Integer;
  hMMBWindow: HWND;

implementation

procedure SetParentWindow (hwnd: HWND); cdecl;
begin
  hMMBWindow := hwnd;
end;

procedure SetFile(sFile: PChar); cdecl;
begin
TextInput:= sFile;
end;

procedure SetData(sData: Integer); cdecl;
begin
  NumInput := sData;
end;

function GetFile(): PChar; cdecl;
begin
  result := PChar(TextOutput);
end;

function GetData(): Integer; cdecl;
begin
  result := NumOutput;
end;

function Copyright(): PChar; cdecl;
begin
  result := 'Copyright © 2011 Loo30fer';
end;

function GetInfo(): PChar; cdecl;
begin
  result := 'Loo30fer';
end;

function GetShortInfo(): PChar; cdecl;
begin
  result := 'http://Loo30fer.com';
end;

exports
  SetFile,
  SetData,
  SetParentWindow,
  GetFile,
  GetData,
  Copyright,
  GetInfo,
  GetShortInfo;

end.

//---------------------------------------------------------------------------

#include <windows.h>
#pragma hdrstop
#pragma argsused
#define to_char(n) (n)+'0'
//---------------------------------------------------------------------------

HWND hMMBWindow;
char TextInput, TextOutput;
int NumInput, NumOutput;
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) void SetParentWindow(HWND hwnd)
{
    hMMBWindow = hwnd;
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) void SetFile(char sPath)
{
        TextInput=sPath;
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) void SetData(int sData)
{
        NumInput=sData;
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) char GetFile()
{
        return TextOutput;
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) int GetData()
{
        return NumOutput;
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) char* Copyright()
{
    return "Copyright © 2011 Loo30fer";
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) char* GetInfo()
{
    return "Loo30fer";
}
//---------------------------------------------------------------------------

extern "C" __declspec(dllexport) char* GetShortInfo()
{
    return "http://Loo30fer.com";
}
//---------------------------------------------------------------------------

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------

----------


## BORHAN TEC

آیا یونیتی که قرار داده اید بخشی از یک فایل DLL است؟؟
اگر این یونیت بخشی از یک dll نیست، آیا می دانستید که میتوان مستقیماً از یونیت های دلفی در C++‎ Builder استفاده کرد.
اگر این یونیت بخشی از یک dll است، چه لزومی دارد که آنرا مجدداً با C++‎ Builder بازنویسی کنید؟
آیا فکر نمی کنید که اگر توابع مرتبط را درون کلاسهایی قرار دهید کدنویسی بسیار راحت تر می شود و اگر در آینده بخواهید این SDK را توسعه دهید با مشکلات کمتری مواجه خواهید شد؟(البته این مورد درصورتی است که از یک dll استفاده نکرده باشید)
آیا شما قصد استفاده از این SDK در زبانهای دیگر (به عنوان مثال زبان های دات نتی) را ندارید؟(اگر پاسخ مثبت است باید کدهای خود را در ActiveX بگنجانید)
آیا این SDK به صورت Open Source خواهد بود؟

*به عنوان یک پیشنهاد دوستانه باید بگویم که این روزها در دنیای برنامه نویسی استفاده از Object Oriented Programming در بیشتر موارد حرف اول را میزند.*

----------


## loo30fer

> آیا یونیتی که قرار داده اید بخشی از یک فایل DLL است؟؟


بلی



> اگر این یونیت بخشی از یک dll است، چه لزومی دارد که آنرا مجدداً با C++‎ Builder بازنویسی کنید؟
> آیا فکر نمی کنید که اگر توابع مرتبط را درون کلاسهایی قرار دهید کدنویسی  بسیار راحت تر می شود و اگر در آینده بخواهید این SDK را توسعه دهید با  مشکلات کمتری مواجه خواهید شد؟(البته این مورد درصورتی است که از یک dll  استفاده نکرده باشید)
> آیا شما قصد استفاده از این SDK در زبانهای دیگر (به عنوان مثال زبان های  دات نتی) را ندارید؟(اگر پاسخ مثبت است باید کدهای خود را در ActiveX  بگنجانید)
> آیا این SDK به صورت Open Source خواهد بود؟


خیر تنها من پلاگین رو در دسترس کاربر خواهم داد - راستش من بعضی مواقع برای دوستان تو یکی از انجمن های بیلدر پلاگینی میسازم که درسته که بیلدر دیگه یک برنامه منسوخ شده به حساب میاد ولی هنوز براحتی کنار گذاشته نخواهد شد ولی باز پلاگینهای من قابل استفاده در برنامه آپادانا که یک برنامه ایرانی هست و برای ساخت برنامه های مالتی مدیا هست و البته رایگان عرضه شده هست.
من SDK تعریف شده تو Delphi و C++‎ Builder رو ضمیمه کردم ممنون میشم یک نگاهی به این SDK ها بندازین و بگین اشکال من تو تعریف کردن SDK که کدش رو تو پست 1 قرار دادم چیست؟
ضمنا من وقتی میخوام یک SDK تعریف کنم Dll Wizard رو انتخاب میکنم بعد یک فرم باز میشه و از من میخواد که ++C یا C رو انتخاب کنم که من ++C رو انتخاب میکنم بعد 4 تا قسمت برای انتخاب میاره که با یکیش که Multi Threaded هست کاری نداریم حالا باید کدومش رو برای ساخت SDK انتخاب کنم Use VCL یا Use CLX یا VC++‎ Style DLL ؟ اگه امکان داشت ممنون میشم بگین هرکدوم برای چه کاری هستن ؟

یک چیز دیگه راستش دلیل اینکه الان دارم با ++C کار میکنم چون حجم پروژه و دی ال ال های تولید شده باهاش خیلی کم حجمتر از دلفی میشه و برای منم حجم پلاگینم یکجورایی مهمه برای همین اکثر پلاگینهام رو با ++C مینویسم و حالا میخوام بدونم میشه کاری کرد که حجم این پلاگینها رو بدون فشرده سازی با UPX و غیره کمتر کرد مثلا تو دلفی وقتی این راهنما {$R *.dfm} رو ازش حذف میکنم حجمش یک کیلوبایت کمتر و خارج کردن توابع از حوزه کتابخانه ها هم خیلی تو حجم پروژه تاثیر داره؟

----------


## BORHAN TEC

> من SDK تعریف شده تو Delphi و C++‎ Builder رو ضمیمه کردم ممنون میشم یک نگاهی به این SDK ها بندازین و بگین اشکال من تو تعریف کردن SDK که کدش رو تو پست 1 قرار دادم چیست؟


این مورد رو به زودی بررسی کرده و نظراتم را در همین پست قرار خواهم داد.



> ضمنا من وقتی میخوام یک SDK تعریف کنم Dll Wizard رو انتخاب میکنم بعد یک فرم باز میشه و از من میخواد که ++C یا C رو انتخاب کنم که من ++C رو انتخاب میکنم بعد 4 تا قسمت برای انتخاب میاره که با یکیش که Multi Threaded هست کاری نداریم حالا باید کدومش رو برای ساخت SDK انتخاب کنم Use VCL یا Use CLX یا VC++‎ Style DLL ؟ اگه امکان داشت ممنون میشم بگین هرکدوم برای چه کاری هستن ؟


Use VCL: زمانی از این گزنه استفاده می شود که قصد استفاده از کلاسهای VCL را در برنامه داشته باشید. مسلماً برای استفاده از VCL باید در سمت چپ C++‎ را انتخاب کرده باشید.
Use CLX: کتابخانه CLX یک کتابخانه قدیمی و Cross Platform است و اکنون می توانم حدس بزنم که شما از نسخه های قدیمی C++‎ Builder استفاده می کنید چرا که این کتابخانه دیگر به همراه نسخه های جدید عرضه نمی شود.
VC++‎ Style DLL : از استایل مربوط به Dll ها در VC++‎ استفاده می کند. به عبارتی دیگر تابعی با نام DLLMain ایجاد می کند و آنرا به عنوان Entry Point ست می کند.



> یک چیز دیگه راستش دلیل اینکه الان دارم با ++C کار میکنم چون حجم پروژه و دی ال ال های تولید شده باهاش خیلی کم حجمتر از دلفی میشه و برای منم حجم پلاگینم یکجورایی مهمه برای همین اکثر پلاگینهام رو با ++C مینویسم و حالا میخوام بدونم میشه کاری کرد که حجم این پلاگینها رو بدون فشرده سازی با UPX و غیره کمتر کرد مثلا تو دلفی وقتی این راهنما {$R *.dfm} رو ازش حذف میکنم حجمش یک کیلوبایت کمتر و خارج کردن توابع از حوزه کتابخانه ها هم خیلی تو حجم پروژه تاثیر داره؟


حجم فایل های DLL و EXE تولید شده با C++‎ Builder از دلفی کمتر نیست. اگر شما این تصور را دارید باید بگویم که دلیل این امر آن است که به صورت پیش فرض گزینه Build with runtime packages در دلفی غیر فعال ولی در C++‎ Builder فعال است. در ضمن باید بگویم که اگر به صورت کلی بخواهیم به قضیه نگاه کنیم باید بگویم که حجم فایل هایی که با دلفی و یا C++‎ Builder ایجاد می شود از حجم فایل هایی که با دات نت و یا VC++‎ ایجاد می شود بیشتر نیست و اگر هم هست باید بگویم که این اختلاف در حد چندین کیلوبایت است. در دات نت همانطور که می دانید بسیاری از کتابخانه ها درون فایل تولید شده قرار نمی گیرند و شما باید فایل های جداگانه ای را به همراه فایل تولید شده عرضه کنید. در VC++‎ هم همینطور است و به نظر می آید که فایل های تولید شده حجم کمی دارند ولی برای اجرای برنامه باید پیش نیاز ها را در سیستم نصب کرده باشید. البته VC++‎ گزینه ای دارد که با استفاده از آن می توانید کلاس های مورد نیاز را در فایل اجرایی تولید شده قرار دهید و دیگر نیازی به نصب پیش نیاز ها نداشته باشید و در این صورت مشاهده می کنید که حجم فایل های ایجاد شده در VC++‎ هم بسیار بالا می رود.



> حالا میخوام بدونم میشه کاری کرد که حجم این پلاگینها رو بدون فشرده سازی با UPX و غیره کمتر کرد مثلا تو دلفی وقتی این راهنما {$R *.dfm} رو ازش حذف میکنم حجمش یک کیلوبایت کمتر و خارج کردن توابع از حوزه کتابخانه ها هم خیلی تو حجم پروژه تاثیر داره؟


یک راه خوب این است که یونیت هایی که در پروژه از آنها استفاده نمی شود را از فهرست uses حذف کنید. البته بهترین راه برای این کار استفاده از cnPack Wizard و استفاده از ابزار Uses Cleaner مربوط به آن می باشد، البته استفاده از ابزار Uses Cleaner در C++‎ Builder کاربردی ندارد.

----------


## loo30fer

> این مورد رو به زودی بررسی کرده و نظراتم را در همین پست قرار خواهم داد.


ممنون پس منتظرم



> Use VCL: زمانی از این گزنه استفاده می شود که قصد استفاده از کلاسهای VCL  را در برنامه داشته باشید. مسلماً برای استفاده از VCL باید در سمت چپ C++‎  را انتخاب کرده باشید.
> Use CLX: کتابخانه CLX یک کتابخانه قدیمی و Cross Platform است و اکنون می  توانم حدس بزنم که شما از نسخه های قدیمی C++‎ Builder استفاده می کنید چرا  که این کتابخانه دیگر به همراه نسخه های جدید عرضه نمی شود.
> VC++‎ Style DLL : از استایل مربوط به Dll ها در VC++‎ استفاده می کند. به  عبارتی دیگر تابعی با نام DLLMain ایجاد می کند و آنرا به عنوان Entry  Point ست می کند.


ممنون از توضیحاتتون.



> حجم فایل های DLL و EXE تولید شده با C++‎ Builder از دلفی کمتر نیست. اگر  شما این تصور را دارید باید بگویم که دلیل این امر آن است که به صورت پیش  فرض گزینه Build with runtime packages در دلفی غیر فعال ولی در C++‎  Builder فعال است.


ولی پلاگینی رو که من با دلفی کمپایل میکنم و همه Uses ها رو حذف میکنم و اون راهنما رو حذف میکنم در آخر حجمش کمتر از 14 کیلوبایت نمیشه ولی تو ++C اگه توابع اضافی رو که تو SDK لازم ندارم حذف کنم 2.5 کیلوبایت و اگه حذف نکنم 4.5 کیلوبایت میشه.
البته در کنار اینکه حجم پلاگین برای من مهم هست امنیت پروژم هم اهمیت بالایی دارد که دکمپایل نشدنی باشه حالا میخواستم بدونم که C++‎ Builder کمپایلر هست یا مفسر؟

----------


## BORHAN TEC

> ولی پلاگینی رو که من با دلفی کمپایل میکنم و همه Uses ها رو حذف میکنم و اون راهنما رو حذف میکنم در آخر حجمش کمتر از 14 کیلوبایت نمیشه ولی تو ++C اگه توابع اضافی رو که تو SDK لازم ندارم حذف کنم 2.5 کیلوبایت و اگه حذف نکنم 4.5 کیلوبایت میشه.


احتمال دارد که شما از نسخه های غیر یکسان دلفی و C++‎ Builder استفاده می کنید. چون اگر نسخه ها یکسان باشند بعید می دانم که حجم برنامه های کاملاً مشابه تولید شده در دلفی بیشتر از C++‎ Builder باشد، زیرا در عمل و تئوری چنین چیزی شدنی نیست. :متفکر: 



> C++‎ Builder کمپایلر هست یا مفسر؟


کامپایلر

----------

