المساعدة - البحث - قائمة الأعضاء - التقويم
نسخة كاملة: أنواع المعطيات في السي ومقابلاتها في الفيجوال بيسك
برمجة - شبكات - كمبيوتر - منتديات الفريق العربي للبرمجة > منتديات لغات البرمجة العام > منتدى مبرمجي C و ++C و C++.NET > أرشيف منتدى قسم السي ++
أنس عبد الله
مرحبا

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

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

المثال بالفيجوال سي هو:
[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 بت ولكن المشكلة في تلك المعطيات المؤشرة فكيف يتم تمثيلها بالفيجوال بيسك
؟؟؟
هاني الأتاسي
في هذي ماني مساعدك يا أنس .......... أنت بتعرف ليش ..؟؟





regular_smile.gif أمزح اليوم في الليل عندي أجاوب عليك ..
neoo
السلام عليكم ،،،
بالنسبة للمتغيرات في الفيجول بيسك والمقابل لها فهي كالتالي :
char : byte
WORD : Integer
DWORD,LONG,HANDLE,LPDWORD,LPARAM,INT,int,LPBOOL,LPHANDLE,SHORT,UINT,LPINT : long
BSTR,LPSTR : String
(طبعا BSTR في الفيجول سي لعيون الفيجول بيسك ).
بالنسبة لـ Void يعني ما ترجه شي اذا كانت Return type ، و معناها ما تستقبل شي في Argment list .
هذا اللي طلع معي ، وياليت تحدد لي نوع عشان اعطيك النوع المقابل له افضل ، وعلى فكرة في متغيرات زي MSG في الفيجول سي وهي عبارة عن Struct ما ادري وش يقابلها في البيسك )-: .

لكن انتبه من مسئلة البوينتر ... فيه متغيرات في الفيجول سي عبارة عن بوينتر .. فأنتبه عن استخدامك لها .. لازم ترسل عنون المتغير ( على ما اعتقد و لست متأكد ان الفيجول بيسك يقوم بارسال اي متغير إلى دالة كبوينتر إلا إذا حددت انت له وقلت له ارسل قيمة ... وهي على ماعتقد بالكلمة ByVal ) .


وش رايك تحط المكتبة هنا، اعتقد افضل !!


تقبل تحياتي ،
أنس عبد الله
شكرا لك يا نيو (أسمك جميل يذكرني بالليل وأصواته عندنا في حلب regular_smile.gif ) مزح regular_smile.gif

ولكن أي مكتبة قصدت أضعها؟
هذه "نسخة - خفيفة" من محتويات الرئيسية للإستعراض الكامل مع المزيد من الصور والخيارات الرجاء إضغط هنا.
Invision Power Board © 2001-2009 Invision Power Services, Inc.