PDA

View Full Version : سوال: سوال در مورد API و dll



mesgar
شنبه 26 مرداد 1387, 13:59 عصر
سلام
من مي خوام تو يه سورس يك dll تابعي بنويسم كه از آن طريق اسم برنامه اي كه اين dll رادر هنگام اجرا فراخواني كرده برگرداند
كسي مي داند از كدام API ويندوز مي شود كمك گرفت ؟؟؟

mehdi.mousavi
شنبه 26 مرداد 1387, 14:15 عصر
سلام
من مي خوام تو يه سورس يك dll تابعي بنويسم كه از آن طريق اسم برنامه اي كه اين dll رادر هنگام اجرا فراخواني كرده برگرداند كسي مي داند از كدام API ويندوز مي شود كمك گرفت ؟؟؟

GetModuleFileName

mesgar
دوشنبه 28 مرداد 1387, 01:55 صبح
سلام
ممنون از راهنمايتون
من الان يك dll با زبان سي پلاس پلاس به نام "dll_new.dll"ساخته ام با كد :


#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
};
char name[100];
char* GetName()
{
GetModuleFileName(NULL,name,100);
return name;
}
و بعد يك پروژه سي شارپ ساخته ام تا بتوانم از آن dll استفاده كنم با كد :


private const string DLLFileName = @"dll_new.dll";
[DllImport(DLLFileName, EntryPoint = "GetName")]
public static extern string GetName();
public Form1()
{
InitializeComponent();
MessageBox.Show(GetName());
}
ولي هنگام اجرا هنگامي كه به خط نشان دادن مسيج باكس مي رسد ارور مي دهد كه :
Unable to find an entry point named 'GetName' in DLL 'dll_new.dll'.
نمي دانم مشكل كجاست ؟؟؟
ممنون مي شم اگه كسي راهنماييم كند

mehdi.mousavi
دوشنبه 28 مرداد 1387, 13:36 عصر
سلام.
آیا GetName رو در DLL اتون EXPORT کردین؟ در فایل .DEF منظورمه، یا بصورت declarative...؟

Nima_NF
دوشنبه 28 مرداد 1387, 14:16 عصر
به شکل زیر می توانید عمل export را انجام دهید: (باید DLL_EXPORTS را تعریف کنید با define)



#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

// DllMain here....

DLL_API char* GetName()
{
GetModuleFileName(NULL,name,100);
return name;
}

mesgar
دوشنبه 28 مرداد 1387, 20:26 عصر
سلام
ممنون از پاسختون ولي كدي كه گفتيد جايگزين كردم ولي ارور داد
ولي با راهنماييتون فهميدم كه چه چيزي كم دارد و كد به صورت زير جواب داد


#include "stdafx.h"
extern "C" {
__declspec(dllexport) char* __cdecl GetName ();
}
char name[100];
extern char* GetName()
{
GetModuleFileName(NULL,name,100);
return name;
}