PDA

View Full Version : این دستور Memory.AllocHLocal توی این کد ارور میده، چکارش کنم؟



javad2000
چهارشنبه 09 خرداد 1386, 17:12 عصر
سلام

لطفاً این نمونه کد رو نگاه کنید، خط هایی که دستور Memory در آنها به کار رفته (با فلش مشخص کرده ام) این ارور را می دهند:
Name 'Memory' is not declared

باید چکار کنم؟
(در ضمن لطفاً از اشتباهاتی که در کد زیر به دلیل دستکاری ویرایشگر تالار ایجاد شده، مثل چسبیدن بعضی کلمات به هم چشمپوشی کنید)



PrivateStructure RASCONN
Dim dwSize AsInteger
Dim hRasCon As IntPtr
Dim szEntryName() AsChar
EndStructure
<DllImport("coredll.dll", SetLastError:=True)> _
PrivateSharedFunction RasEnumConnections(ByVal lpRasCon As IntPtr, ByRef lpCb AsInteger, ByRef lpcConnections AsInteger) AsInteger
EndFunction
PublicSharedFunction EnumerateConnections() AsBoolean
Dim structPtr As IntPtr
Dim size, lpCb, lpcConn AsInteger
Dim rasConn AsNew RASCONN
size = Marshal.SizeOf(rasConn) + (20 * Marshal.SystemDefaultCharSize)
rasConn.dwSize = size
ReDim rasConn.szEntryName(20)
lpCb = size
'--------------------->
structPtr = memory.AllocHLocal(size)
Marshal.StructureToPtr(rasConn, structPtr, False)
If (RasEnumConnections(structPtr, lpCb, lpcConn) = 0) Then
For i AsInteger = 0 To lpcConn - 1
rasConn = CType(Marshal.PtrToStructure(structPtr, GetType(RASCONN)), RASCONN)
Next
Else
ReturnFalse' failure
EndIf
'--------------->
Memory.FreeHLocal(structPtr)
ReturnTrue' success
EndFunction


PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(Me.EnumerateConnections)
EndSub

__H2__
پنج شنبه 10 خرداد 1386, 11:51 صبح
سلام
خوب واضح است، اصلاٌ ماژولی به نام Memory نداریم.
مثل اینه که من همینوطر بنویسیم "برو و تابع Ali را اجرا کن" باید تابع Ali وجود داشته باشه یا نه؟؟؟؟؟

احتمالاً کدهای فوق را از C گیر آورده اید.
به هرحا برای حافظه گیری برای Structure ها نیازی به هیچ کاری نیست. ذات تعریف یک Structure در VB.Net موجب حافظه گیری خودکار میشود، به آزاد سازی حافظه هم کلاً نیازی نیست.

شاید کد زیر مشکلتان را حل کنید


Private Declare Ansi Function RasEnumConnections Lib"coredll.dll" (<System.Runtime.InteropServices.MarshalAs(Runtime.I nteropServices.UnmanagedType.LPStruct)> ByVal lpRasCon As RASCONN, ByRef lpCb As Integer, ByRef lpcConnections As Integer) As Integer

Private Structure RASCONN
Public dwSize As Integer
Public hRasCon As Integer

<Global.Microsoft.VisualBasic.VBFixedString(20)> Public szEntryName As String

'<Global.Microsoft.VisualBasic.VBFixedArray(19)> _
'<System.Runtime.InteropServices.MarshalAs(Runtime.I nteropServices.UnmanagedType.LPStr)> _
'Public szEntryName() As Char


Public Sub New(ByVal CharSize As Integer)
Me.szEntryName = New String(" "c, CharSize)
'Me.szEntryName = NewChar(CharSize) {}
Me.dwSize = 4 + 4 + 20
End Sub
End Structure

Public Shared Function EnumerateConnections() As Boolean
Dim lpCb, lpcConn As Integer
Dim rasConn As New RASCONN(20)
lpCb = rasConn.dwSize

If RasEnumConnections(rasConn, lpCb, lpcConn) = 0 Then
'Already rasConn
Return True' success
Else
Return False' failure
End If
End Function



اگر به حالت آرایه خواستید میتوانید دستورات نارنجی رنگ را فعال کنید و دستور بالایی را حذف کنید

در مورد جایی هم که در خط اول بولد شده.
بهتر است ترکیبات دیگر مثل:
Struct)> ByVal
LPStruct)> ByRef
Struct)> ByRef

را هم امتحان کنید، یکی از این چهار ترکیب به خوبی جواب میدهد ولی الآن یادم نیست و وقت امتحان کردن هم ندارم.

ضمناً دستور For شما کاملاً بی معنی بود.

javad2000
پنج شنبه 10 خرداد 1386, 13:56 عصر
سلام
تا حالا حداقل 15 تا Sample Code از جاهای مختلف دریافت کردم که همه شون روش درست برای فراخوانی تابع RasenumConnections رو نشون میدن فقط همه شون یه ایراد کوچک دارند. اون هم این که کار نمی کنند.

این نمونه کد شما هم همینطوره. هر کاری می کنم نمیتونم کارش بندازم.
بابا من یه تازه کارم. یکی یه کد تست شده بده لطفاً که خیلی لازم دارم.
خیلی ممنون