منتديات الحضرمي
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

منتديات الحضرمي

منتديات تقنية المعلومات و التكنولوجيا الحديثة يمكنك الأن الإشراف سحل وشارك في المواضيع والردود
 
الرئيسيةالبوابةأحدث الصورالتسجيلدخول

 

 أنواع المعطيات في السي ومقابلاتها في الفيجوال بيسك

اذهب الى الأسفل 
كاتب الموضوعرسالة
the_imperial911
مشرف
مشرف
the_imperial911


المساهمات : 50
تاريخ التسجيل : 31/07/2007
العمر : 41

أنواع المعطيات في السي ومقابلاتها في الفيجوال بيسك Empty
مُساهمةموضوع: أنواع المعطيات في السي ومقابلاتها في الفيجوال بيسك   أنواع المعطيات في السي ومقابلاتها في الفيجوال بيسك Icon_minitimeالجمعة أغسطس 17, 2007 5:44 am

مرحبا

عندي مكتبة ربط ديناميكية مع مثال على استخدامها في الفيجوال سي،، وأنا أريد أن أقوم بتحويل هذا المثال إلى الفيجوال بيسك لكنني هدرت ثلاثة ساعات على اللاشيء وأحسست بأني أدور في حلقة فارغة وفي النهاية أصبحت أجرب فقط عل وعسى أهتدي إلى حل

المشكلة هي في تمرير البارامترات إلى هذه المكتبة:

المثال بالفيجوال سي هو:
[code2]
#include
#include
#include "aspi32.h"


INT InitASPI32();
BOOL SendSCSICmd(LPSRB_ExecCmd lpSrb);
BYTE CalculateCDBSize(BYTE ScsiCmd);
VOID FreeASPI32();


static HINSTANCE hInst;
static HANDLE hEvent;
static pfnGetASPI32SupportInfo GetASPI32SupportInfo;
static pfnSendASPI32Command SendASPI32Command;


void main()
{
// always first call
if (InitASPI32() == -1)
{
printf("nInitASPI32 Error!");
return;
}

SRB_ExecCmd Cmd;
ScsiInquiryData InqData;
memset(&Cmd, 0, sizeof(SRB_ExecCmd));

// set device ID
Cmd.SRB_Header.HostID = 0x00;
Cmd.TargetID = 0x00;
Cmd.LUN = 0x00;

// set command specific info in CDB
// !!!!!!! All WORD or larger than field reverse byte order !!!!!!!!!!
// !!!!!!! but ONLY in CDB !!!!!!!!!!!
Cmd.CDB.Inquiry.Cmd = 0x12;
Cmd.CDB.Inquiry.DataLength = sizeof(ScsiInquiryData);

// set command specific info in ASPI fields
// !!!!!! normal byte order !!!!!!!
Cmd.dwBufferLength = sizeof(ScsiInquiryData); // size of input buffer
Cmd.lpBuffer = &InqData; // point to input buffer
Cmd.SRB_Header.Flags = SRB_DIR_IN; // enabled data in

// and send command
if (SendSCSICmd(&Cmd))
{
// if success
printf("n%.8s %.16s %.4s", InqData.lpstrVendorID, InqData.lpstrProductID, InqData.lpstrRevisionLevel);
}

// always last call
FreeASPI32();
}


// parameter:
// return value:
// if FALSE then error otherwise success

BOOL SendSCSICmd(LPSRB_ExecCmd lpSrb)
{
// automatic set these fields
lpSrb->SRB_Header.Cmd = ASPI_EXEC_SCSI_CMD;
lpSrb->SRB_Header.Flags |= SRB_EVENT_NOTIFY;
lpSrb->lpPostRoutine = (LPVOID)hEvent;
lpSrb->SenseLength = sizeof(ScsiRequestSenseData);
lpSrb->CDBLength = CalculateCDBSize(lpSrb->CDB.Bytes[0]);

if (!ResetEvent(hEvent))
return FALSE;

// call WNASPI32 dll
DWORD dwStatus = SendASPI32Command(lpSrb);

if (dwStatus == SS_PENDING)
WaitForSingleObject(hEvent, INFINITE);

if (lpSrb->SRB_Header.Status != SS_COMP)
return FALSE;

return TRUE;
}



// parameter:
// ScsiCmd any valid SCSI command opcode
// return value:
// if 0 then error otherwise success

BYTE CalculateCDBSize(BYTE ScsiCmd)
{
switch ((ScsiCmd >> 5) & 0x07)
{
case 0:
return 6;
case 1: case 2:
return 10;
case 4:
return 16;
case 5:
return 12;
}

return 0;
}


// parameter:
// none
// return value:
// if -1 then error ( no ASPI driver or no supported adapter )
// otherwise host adapters count

int InitASPI32()
{
if (!(hInst = LoadLibrary("WNASPI32")))
return -1;

GetASPI32SupportInfo = (pfnGetASPI32SupportInfo)GetProcAddress(hInst, "GetASPI32SupportInfo");
SendASPI32Command = (pfnSendASPI32Command)GetProcAddress(hInst, "SendASPI32Command");

hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (!GetASPI32SupportInfo || !SendASPI32Command || !hEvent)
{
FreeLibrary(hInst);
return -1;
}

DWORD dwStatus = GetASPI32SupportInfo();
BYTE Status = HIBYTE(LOWORD(dwStatus));
BYTE HostCount = LOBYTE(LOWORD(dwStatus));

if (Status != SS_COMP && Status != SS_NO_ADAPTERS)
{
FreeLibrary(hInst);
return -1;
}

return HostCount;
}


// parameter:
// none
// return value:
// none

VOID FreeASPI32()
{
FreeLibrary(hInst);
CloseHandle(hEvent);
}
[/code2]

أرجو أن يتفضل أحد ويشرح لي فقط كيفية تمرير البارامترات إلى مكتبة الـ DLL وهل هنالك إمكانية لتحويل مثل هذا الكود إلى الفيجوال بيسك أم أن ذلك مستحيل؟؟؟

شيء آخر أريد أن استفسر عنه
أريد جدولا بأنواع المعطيات في الفيجوال سي ومقابلاتها في الفيجوال بيسك، أذكر مرة أني لمحت هذا الجدول ضمن مواضيع الـ MSDN ولكنني لم أعد أقدر أعثر عليه من جديد... أعرف مثلا أن DWORD يقابلها LONG لأنهما الاثنان بطول 32 بت ولكن المشكلة في تلك المعطيات المؤشرة فكيف يتم تمثيلها بالفيجوال بيسك
؟؟؟

Basketball
الرجوع الى أعلى الصفحة اذهب الى الأسفل
 
أنواع المعطيات في السي ومقابلاتها في الفيجوال بيسك
الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1
 مواضيع مماثلة
-
» أنواع الحواسيب المحمولة وميزاتها...من أفضل أنواع الحواسيب ال
» مرجعك المختصر في أنواع بروتوكولات التوجيه(مهم)

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
منتديات الحضرمي :: منتديات لغات البرمجة :: منتدى مبرمجي C و ++C و C++.NET-
انتقل الى: