PDA

View Full Version : چرا با API جواب نمیده ؟



mkbo_webmaster
یک شنبه 27 فروردین 1385, 13:55 عصر
من خیلی وقت بود با Visual Basic 6 کار میکردم. جدیدا اونو کنار گذاشتم و دارم روی دات نت کار میکنم. امروز میخواستم از کدهای API در پروژه های دات نتم استفاده کنم. میدونستم که برای استفاده از این کدها باید اونا رو تغییر بدم. مثلا long به int32 و همینطور type ها رو اینکار رو کردم ولی باز هم VB یک خط بنفش زیر اونا کشید و tooltip اون متن زیر بود :

statement is not valid in a namespace

به نظر شما مشکل چیه ؟
متشکر ...





/

omid_Ahmadi
یک شنبه 27 فروردین 1385, 14:14 عصر
دوست من فقط با تغییر Type ها که نمیتونی از یه API توی .NET استفاده کنی. این کار واسه خودش کلی مراحل داره، باید از P/Invoke استفاده کنی.
پست 7 و 9 رو توی تاپیک زیر ببین:

http://www.barnamenevis.org/forum/showthread.php?t=42457

mkbo_webmaster
یک شنبه 27 فروردین 1385, 14:34 عصر
از راهنمائیهای بسیار سودمند شما خیلی ممنونم.
من رفتم داخل همون لینکی که گفتید. و مشکلم حل شد.
با آرزوی موفقیت برای شما





/

ghafoori
یک شنبه 27 فروردین 1385, 14:57 عصر
با یکم تغیرات درست میشه من برای فراخوانی تابع setpixel از dll gdi32 برای تغییر رنگ پیکسلهای یک picturebox بنام pb1 کد زیر را بکار بردم و جواب داد
Private Declare Auto Function SetPixel Lib "gdi32" (ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal crcolor As Integer) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b As Integer
Dim c As Color = Color.Blue
b = c.ToArgb
Dim g As Graphics = pb1.CreateGraphics
Dim hdc As IntPtr
hdc = g.GetHdc
For a = 1 To 100
SetPixel(hdc, a, 100, b)
Next
End Sub
برای توابع دیگر نیز با کمی تغییرات درست میشود

omid_Ahmadi
یک شنبه 27 فروردین 1385, 15:06 عصر
یعنی بدون استفاده از نیم اسپیس InteropServices و فقط با نوشتن کد بالا این کار رو کردید.

خوبه،میشه یه جوری کد رو بنویسید که یشه اون رو خوند، منظورم اینه که از تگ Code استفاده کنید. چون این جوری اصلا معلوم نیست که توی این پست چی نوشته شده.

mkbo_webmaster
یک شنبه 27 فروردین 1385, 15:51 عصر
عالیه . لطفا اگه میشه کداتون رو بین تگهای

{code}thecode{/code}

البته [ باید در بالا { بشه
قرار بدید.

ممنون از اطلاعات با ارزشتون




/

ghafoori
یک شنبه 27 فروردین 1385, 16:53 عصر
این هم لینک دانلود بهتر از کد خالیه
3248:لبخند:
اما توابع دات نت خود از api های ویندوز استفاده میکنند و حتا بهتر چون انها را با هم ادغام میکند
من در کتابی خواندم فراخوانی api ان هم بصورت مستقیم در حافظه حفره هایی ایجاد کند که از لحاظ امنیتی خطر ناک است {کتاب vc++.net از کانون نشر علوم} اما سرعت برنامه بیشتر می شود زیرا ما خودمان مستقیما توابع را درخواست میکنیم نه با clr حالا انتخاب با شماست

ghafoori
یک شنبه 27 فروردین 1385, 17:11 عصر
حواسم نبود من با vs.net2005برنامه مینویسم ممکن است کسی دچار مشکل شود این هم کد خالی

Public Class Form1
Private Declare Auto Function SetPixel Lib "gdi32" (ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal crcolor As Integer) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b As Integer
Dim c As Color = Color.Blue
b = c.ToArgb
Dim g As Graphics = pb1.CreateGraphics
Dim hdc As IntPtr
hdc = g.GetHdc
For a = 1 To 100
SetPixel(hdc, a, 100, b)
Next
End Sub
End Class
:بامزه:

mkbo_webmaster
دوشنبه 28 فروردین 1385, 15:08 عصر
لطف کردید.
نمیدونم چرا کد اولیتون کار نکرد ؟
به زبان VB بود ؟ یا ...
مرسی ، حالا کد دومتون رو امتحام میکنم.
با تشکر...




/

mkbo_webmaster
دوشنبه 28 فروردین 1385, 15:11 عصر
راستی من به یه موضوعی پی بردم توی VB6 حداکثر طول قابل قبول برای رشته های محدود 65535 کاراکتر هستش ولی در دات نت باور نکردنیه.
البته این ممکنه زیاد به درد برنامه نویسا نخوره ولی توی عمل خیلی مفید خواهد بود.
مثلا در نوشتن برنامه های SPIDER بر روی اینترنت بسیار بسیار این خصوصیت کمک بزرگی میکنه.




/

niloufar
دوشنبه 28 فروردین 1385, 16:48 عصر
سلام
1- جناب غفوری! این خیلی جالبه که کد شما کار میکنه. آیا این به این معنیه که همه api ها به همین راحتی قابل استفاده در دات نت هستند؟ میشه یه کم توضیح بدید دقیقا تو این تبدیلات چیو به چی باید تبدیل کنیم و در واقع دقیقا باید چی کار کنیم!!
2- آقای احمدی نظر شما در این مورد چیه؟

ghafoori
دوشنبه 28 فروردین 1385, 20:12 عصر
توبع دات نت خود از api ها استفاده میکنند بنابراین تمامی توابع api معادلی در دات نت دارند البته بجز چند نمونه مثلا همین تابع setpixel بنابراین انقدرها مهم نیست تازه ممکن است مشکلات امنیتی نیز پیش بیاید ولی امکاناتی نیز دارد ما میتوانیم توابعی را با زبان اسمبلی یا سی یا سی ++ بنویسیم و در برنامه قرار بدهیم مخصوصا زبان اسمبلی برای سرعت بخشیدن به کار برنامه {برای نوشتن dll بزبان اسمبلی به کتاب crack انتشارات ناقوس مراجعه کنید}

اما اگر دوست دارید از api استفاده کنید هرجا hdc خواسته شد باید یک متغییر از نوع intptr تعریف کنید و با متد gethdc از شی graphics ان را مقدار دهید مانند مثال قبل و هر متغییر long خواسته شد بجایش integer قرار دهید و بجای hwnd یک متغییر intptr تعریف کرده و ان را با خصوصیت handle کنترل مقدار دهی کنید مثلا تابع SetWindowText که کپشن فرم را تغییر میدهد
کد

Public Class Form1
Private Declare Auto Function SetPixel Lib "gdi32" (ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal crcolor As Integer) As Integer
Private Declare Auto Function SetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal ipstring As String) As Integer

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, d As Integer
Dim c As Color = Color.Blue
b = c.ToArgb
Dim g As Graphics = pb1.CreateGraphics
Dim hdc, hwnd As IntPtr
hdc = g.GetHdc
For a = 1 To 100
SetPixel(hdc, a, 100, b)
Next
hwnd = Me.Handle
SetWindowText(hwnd, "ali")
End Sub
End Class

و بقیه نیز به همین صورت سوالی بود بپرسید خوشحال میشوم اگر بتوانم کمکی بکنم:لبخند:

niloufar
سه شنبه 29 فروردین 1385, 10:21 صبح
سلام
ممنون

mkbo_webmaster
سه شنبه 29 فروردین 1385, 17:13 عصر
من آخر نتونستم نتیجه مثبت بگیرم. نمیدونم چیکار کنم.
برای اینکه گیج نشید من کدهای VB6 پروژم رو میدم. که واقعانم توی VB6 کار میکنه ولی میخوام توی دات نت کارکنه تا بتونه بیشتر از 65535 کاراکتر رو Read کنه.




Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long

Private Sub Form_Load()
Dim t As Long
Dim ttext As String
Text1.Text = Online_HTML_Returner("http://www.mkbo.com/index.asp", 90000)
Debug.Print Len(Text1.Text)
End Sub
Private Function Online_HTML_Returner(ByVal URL As String, ByVal THEBUFFER As Long) As String
On Error Resume Next
Dim hOpen As Long, hFile As Long
Dim sBuffer As String
Dim Ret As Long

sURL = URL
'Create a buffer for the file we're going to download
sBuffer = Space(THEBUFFER)
'Create an internet connection
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
OHR:
'Open the url
hFile = InternetOpenUrl(hOpen, sURL, vbNullString, ByVal 0&, INTERNET_FLAG_RELOAD, ByVal 0&)
'Read the first 1000 bytes of the file
InternetReadFile hFile, sBuffer, THEBUFFER, Ret
'Show our file
' If Len(Trim(sBuffer)) <> Ret Then
' THEBUFFER = Ret
' Ret = 0
' sBuffer = Space(THEBUFFER)
' InternetCloseHandle hFile
' GoTo OHR:
' End If

'clean up
InternetCloseHandle hFile
InternetCloseHandle hOpen

Online_HTML_Returner = Trim(sBuffer)
End Function



این کد بالا رو در حالت آنلاین یه تست کنید. میفهمید.
اگه کمک کنید ممنون میشم.
باتشکر






/

ghafoori
سه شنبه 29 فروردین 1385, 19:24 عصر
شما تمام توابع را ذکر نکردید مثلا توابع InternetOpen و InternetOpenUrl و اغلب توابعی که شما
استفاده کردید معادلهای بسیار ساده تری در دات نت دارند مانند کلاس file که قابلیت ایجاد و حذف و غیره را دارد
خوب شما تمام توابع را درست معرفی کنید این توابع تعریف نشده اند
InternetReadFile و InternetOpenو InternetCloseHandleو InternetOpenUrl
تا من ببینم میتوانم کاری بکنم:چشمک:

mkbo_webmaster
چهارشنبه 30 فروردین 1385, 23:06 عصر
ببخشید حواسم نبود اینم کاملش (درسته کپی کنید و paste کنید توی پروژتون)




Const scUserAgent = "Test Connection"
Const INTERNET_OPEN_TYPE_DIRECT = 1
Const INTERNET_OPEN_TYPE_PROXY = 3
Const INTERNET_FLAG_RELOAD = &H80000000
Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet" (ByVal hInet As Long) As Integer
Private Declare Function InternetReadFile Lib "wininet" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetOpenUrl Lib "wininet" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal lpszUrl As String, ByVal lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long


'This program needs a Dialog box, named CDBox1
' (To add the Common Dialog Box to your tools menu, go to Project->Components (or press CTRL-T)
' and select Microsoft Common Dialog control)
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FO_DELETE = &H3
Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
Private Declare Function CreateDirectory Lib "kernel32" Alias "CreateDirectoryA" (ByVal lpPathName As String, lpSecurityAttributes As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Declare Function GetFileTime Lib "kernel32" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Declare Function FileTimeToLocalFileTime Lib "kernel32" (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long

Private Sub Form_Load()
Text1.Text = Online_HTML_Returner("http://www.mkbo.com/index.asp", 90000)
Debug.Print Len(Text1.Text)
End Sub
Private Function Online_HTML_Returner(ByVal URL As String, ByVal THEBUFFER As Long) As String
On Error Resume Next
Dim hOpen As Long, hFile As Long
Dim sBuffer As String
Dim Ret As Long

sURL = URL
'Create a buffer for the file we're going to download
sBuffer = Space(THEBUFFER)
'Create an internet connection
hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
OHR:
'Open the url
hFile = InternetOpenUrl(hOpen, sURL, vbNullString, ByVal 0&, INTERNET_FLAG_RELOAD, ByVal 0&)
'Read the first 1000 bytes of the file
InternetReadFile hFile, sBuffer, THEBUFFER, Ret
'Show our file
' If Len(Trim(sBuffer)) <> Ret Then
' THEBUFFER = Ret
' Ret = 0
' sBuffer = Space(THEBUFFER)
' InternetCloseHandle hFile
' GoTo OHR:
' End If

'clean up
InternetCloseHandle hFile
InternetCloseHandle hOpen

Online_HTML_Returner = Trim(sBuffer)
End Function

omid_Ahmadi
پنج شنبه 31 فروردین 1385, 20:03 عصر
سلام
1- جناب غفوری! این خیلی جالبه که کد شما کار میکنه. آیا این به این معنیه که همه api ها به همین راحتی قابل استفاده در دات نت هستند؟ میشه یه کم توضیح بدید دقیقا تو این تبدیلات چیو به چی باید تبدیل کنیم و در واقع دقیقا باید چی کار کنیم!!
2- آقای احمدی نظر شما در این مورد چیه؟


اگر یه مقدار دقت کنید متوجه می شید که کدی که این دوستمون گفتم فرقی با این کدی که من در توی اون تاپیک گفتم نداره. اگر فکر می کنید این دو تا کد خیلی با هم فرق دارن و نمی تونید شباهت اونها رو درک کنید، کد برنامه ای که من در تاپیک قبلی نوشته بودم به زبان VB به صورت زیر در میاد:



Imports System.Runtime.InteropServices
Public Class Win32
Declare Auto Function MessageBox Lib "user32.dll" _
(ByVal hWnd As Integer, _
ByVal txt As String, ByVal caption As String, _
ByVal Typ As Integer) As Integer
End Class


در ضمن اگه به اون لینکی که توی پایین تاپیک قبلی گفته بودم مراجعه می کردید، مطلب زیر رو حتما می دیدید:



Managed definitions to unmanaged functions are language-dependent




توبع دات نت خود از api ها استفاده میکنند


بله این مورد کاملا درسته، چون در هر صورت باید برنامه به وسیله ی ویندوز اجرا بشه، و .NET یا CLR نیستند که برنامه رو اجرا می کنن.



ما میتوانیم توابعی را با زبان اسمبلی یا سی یا سی ++ بنویسیم و در برنامه قرار بدهیم مخصوصا زبان اسمبلی برای سرعت بخشیدن به کار برنامه {برای نوشتن dll بزبان اسمبلی به کتاب crack انتشارات ناقوس مراجعه کنید}


اگر این گفته ی شما این طوری که من تفسیر کردم باشه، یه مشکلی توش هست. اگر میشه واضحتر توضیح بدید تا راجع بهش صحبت کنیم.

ghafoori
یک شنبه 03 اردیبهشت 1385, 05:19 صبح
ببخشید دیر شد من هرچی تلاش کردم جواب نداد:عصبانی++: :گیج: :گریه:
اما دو پیشنهاد دارم یکی این توابع را داخل یک dll قرار دهید و این dll را در vb.net بکار برید
دوم یا چند وقت پیش یک پراکسی دیدم که با c#.net نوشته سده بود و به این صورت کار میکرد
صفحات را میگرفت و با استفاده از ip خود میفرستاد این پراکسی open source است و در همین
سایت نیز عضو است از ایشان به پرس چگونه میتواند صفحات را دانلود کند برای پیدا کردن ایشان
به این ادرس روجوع کنیدhttp://www.asproxy.somee.com/ امیدوارم مشکلتان حل شود:لبخند:

mkbo_webmaster
یک شنبه 03 اردیبهشت 1385, 15:11 عصر
متشکرم که اقلا یکی اقلا یک پاسخی به ما داد.
با تشکر از آقای غفوری




/

mkbo_webmaster
یک شنبه 03 اردیبهشت 1385, 15:24 عصر
سوالم رو به وبمستر اون سایته فرستادم. امیدوارم جواب بده.
اگه داد جوابو میزارم تو فرم.
باتشکر





/

niloufar
چهارشنبه 06 اردیبهشت 1385, 17:16 عصر
سلام
جناب غفوری. من امروز نیاز به یه Api داشتم که با دستورات شما تبدیلش کردم و تو 2005 مشتی کار کرد. کلی حال کردم. گفتم بد نیست ازتون تشکر کنم. ممنون