مرحبا
عندي مكتبة ربط ديناميكية مع مثال على استخدامها في الفيجوال سي،، وأنا أريد أن أقوم بتحويل هذا المثال إلى الفيجوال بيسك لكنني هدرت ثلاثة ساعات على اللاشيء وأحسست بأني أدور في حلقة فارغة وفي النهاية أصبحت أجرب فقط عل وعسى أهتدي إلى حل
المشكلة هي في تمرير البارامترات إلى هذه المكتبة:
المثال بالفيجوال سي هو:
[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 بت ولكن المشكلة في تلك المعطيات المؤشرة فكيف يتم تمثيلها بالفيجوال بيسك
؟؟؟