الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

مغلق
بدأه أنس عبد الله في 12 أغسطس 2001 · 3 رد · 2,237 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

مرحبا

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

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

المثال بالفيجوال سي هو:

#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);
}

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

شيء آخر أريد أن استفسر عنه

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

؟؟؟

#2

في هذي ماني مساعدك يا أنس .......... أنت بتعرف ليش ..؟؟

:) أمزح اليوم في الليل عندي أجاوب عليك ..

Coding on the Cloud and for the Cloud!

My Blog

#3

السلام عليكم ،،،

بالنسبة للمتغيرات في الفيجول بيسك والمقابل لها فهي كالتالي :

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 ) .

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

تقبل تحياتي ،

#4

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

ولكن أي مكتبة قصدت أضعها؟

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…