Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213

Срочно - стринги и вызов Win32 API функций

10.05.2006, 16:00. Показов 3450. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ответ на первоначальный вопрос найден с помощью Messir-a.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Declare Function FtpFindFirstFile Lib "wininet.dll" _
   (ByVal hConnect As IntPtr, ByVal searchFile As String, _
   ByRef findFileData As WIN32_FIND_DATA, ByVal flags As Integer, _
   ByVal context As IntPtr) As IntPtr
 <Serializable(), StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
    Structure WIN32_FIND_DATA
    Public dwFileAttributes As FileAttributes
    Public ftCreationTime As FILETIME
    Public ftLastAccessTime As FILETIME
    Public ftLastWriteTime As FILETIME
    Public nFileSizeHigh As Integer
    Public nFileSizeLow As Integer
    Public dwReserved0 As Integer
    Public dwReserved1 As Integer
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
      Public cFileName As String
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=14)> _
        Public cAlternate As String
    End Structure
Ключевыми словами тут является декларирование стринга в структуре с маршализацией и указанием точного типа и размера стринга.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2006, 16:00
Ответы с готовыми решениями:

Срочно - стринги и вызов Win32 API функций (.NET)
Я новичек в VB.NET. В VB6 можно было декларировать стринг как Dim strDirectory as String * 256и потом передать в API функцию...

описание функций Win32 API получение имени компьютере GetComputerName
Задание: Написать и отладить консольную программу на языке ассемблера. Функция :Win32 API получение имени компьютере GetComputerName. не...

Вызов API функций
Как вызывать в C# API функции, например вот эту BOOL CALLBACK MonitorEnumProc( __in HMONITOR hMonitor, __in HDC hdcMonitor, ...

4
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
27.06.2012, 14:35  [ТС]
Я новичек в VB.NET.

В VB6 можно было декларировать стринг как
Visual Basic
1
Dim strDirectory as String * 256
и потом передать в API функцию декларированную как
Visual Basic
1
2
3
Private Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" ( _
                                ByVal hConnect As Integer, ByRef sCurrentDirectory As String, _
                                ByRef dwCurrentDirectory As Integer) As Boolean
после чего вызов выглядит как
Visual Basic
1
FtpGetCurrentDirectory(hConnect, strDirectory, dwDirLen )
Теперь же, в .NET декларация функции выглядит так
VB.NET
1
2
3
Private Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" ( _
                                ByVal hConnect As Integer, ByVal sCurrentDirectory As System.Text.StringBuilder, _
                                ByRef dwCurrentDirectory As Integer) As Boolean
а вызов так
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim strPath As String, dwCount As Integer = 1024, bRes As Boolean
Dim strBuilder As New System.Text.StringBuilder(dwCount)
 
   If (Connected) Then
       bRes = _FtpGetCurrentDirectory(m_hSession, strBuilder, dwCount)
       If (bRes = False) Then
           strPath = Nothing
       Else
           strPath = strBuilder.ToString()
       End If
 
   Else
       strPath = Nothing
   End If
Это более запутанно, но еще понятно. Но в следующем случае я не понимаю как мне декларировать структуру, чтобы вызов API был правильным:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" ( _
                                ByVal hConnect As Integer, ByVal sSearchFile As String, _
                                ByRef findFileData As WIN32_FIND_DATA, ByVal dwFlags As Integer, _
                                ByVal dwContext As Integer) As Integer
 
    Private Structure WIN32_FIND_DATA
        Dim dwFileAttributes As Integer
        Dim ftCreationTime As System.Runtime.InteropServices.ComTypes.FILETIME
        Dim ftLastAccessTime As System.Runtime.InteropServices.ComTypes.FILETIME
        Dim ftLastWriteTime As System.Runtime.InteropServices.ComTypes.FILETIME
        Dim nFileSizeHigh As Integer
        Dim nFileSizeLow As Integer
        Dim dwReserved0 As Integer
        Dim dwReserved1 As Integer
        <VBFixedString(256)> Dim cFileName As String
        <VBFixedString(14)> Dim cAlternateFileName As String
    End Structure
 
...
 
   Dim winFileData As WIN32_FIND_DATA, strFileName As String = Nothing
   Dim hDirConnect As Integer
 
   hDirConnect = FtpFindFirstFile(m_hSession, "", winFileData, 0, 0)      ' <--- Здесь происходит ексепшион
Как я понял, проблема в декларации стрингов в структуре. Я пробовал декларировать их и как обычный стринг, и как
System.Text.StringBuilder, но ничего не помогает. (тип ошибок при различных декларациях разный, но результат тот же).

Вопрос: как в .NET декларируются структуры со стрингами для последующей передачи их в Win32 API функции для заполнения полей?
0
0 / 0 / 0
Регистрация: 20.02.2007
Сообщений: 48
27.06.2012, 17:29
А зачем через API? дот-нет имеет встроенные cредства доступа к FTP

/// MSDN

The .NET Framework provides comprehensive support for the FTP protocol with the FtpWebRequest and FtpWebResponse classes. These classes are derived from WebRequest and WebResponse. In most cases, the WebRequest and WebResponse classes provide all that is necessary to make the request, but if you need access to the FTP-specific features exposed as properties, you can typecast these classes to FtpWebRequest or FtpWebResponse.

Examples
For more information, see the following topics: How to: Download Files with FTP, How to: Upload Files with FTP, and How to: List Directory Contents with FTP.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
27.06.2012, 19:23  [ТС]
Это очень хорошо, что есть встроенная поддержка FTP, но:

1. Так как .Net не заменяет все функции WinAPI, то если не в этот раз, то в другой, я снова столкнусь с необходимостью получения инфы от виндов через структуры в которых могут быть стринги, и как мне их все же создавать и передавать?

2. Из просмотра топиков "How to: Download Files with FTP" и т.д. я не понял, а как мне передавать [bold]команды[/bold] например такую "siteside blksize 3096"? Мне необходимо подключаться через FTP к Mainfraim-у. А у него есть особые команды.

Хочу заметить, что приведенные топики дают примеры исползования на C#, а я его не знаю, да и VB.NET для меня тоже пока в новинку.
0
0 / 0 / 0
Регистрация: 20.02.2007
Сообщений: 48
28.06.2012, 17:48
В принципе ты прав. Но для того, в том числе, и создавался дотнет чтобы избежать использования вызовов API (за исключением выдающихся случаев).

Насчет как передать команду

///MSDN

The Method property determines which command is sent to the server. Typically, you set Method by using the strings defined in the WebRequestMethods.Ftp structure. When setting Method to UploadFile, you must do so before calling the GetRequestStream method. Failure to call these members in the correct order causes a ProtocolViolationException exception when you attempt to get the request stream.

The credentials supplied for the FtpWebRequest object must have permission to perform the specified method. If not, the FTP command fails.

You can set Method to any command recognized by the server and use the FtpWebRequest object to send the command. This works as expected only if the command does not require you to send data and the server does not send data in response to the request.

You must not send any command that alters the state of the connection. For example, do not use the "MODE", "PASV", or "PORT" commands. Using commands that change the state of the connection can leave the request and the underlying connection in an unusable state. To determine the success or failure of a command, check the Status and StatusDescription properties.

Может тебе стоит внимательно почитать там и разобрать предложенные примеры - в 90% случаев помогает.

И еще, где то на сайте MSDN валяется архив 101 VB.Net samples.
Скачай и знакомься с особенностями языка.

Работу с сетевыми потоками можно посмотреть в примере
Advanced .NET Framework (Networking) - Use Sockets
А в нем клиентскую часть.

Кстати, если ты четко понимаешь что и как передавать - можешь использовать его впрямую, просто поменяй открываемые порты (там используется 80(HTTP)).

Надеюсь, что помог.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.06.2012, 17:48
Помогаю со студенческими работами здесь

Вызов API функций в VB.NET
Такая у меня проблемка: Подскажите, кто сталкивался. Пробую пользоваться библиотекой p2smon.dll (Crystal Reports) для создания TTX файла...

Прямой вызов функций ODBC API
Есть код: //(SQLDataSources) typedef SQLRETURN (__import * _ODBCDataSources(SQLHENV EnvironmentHandle, ...

Вызов функций Windows API в HomeLisp 1.13.51
Как реализовать вызов функций Windows API из программ на HomeLisp версии 1.13.51? Если возможно, приведите пример работы с функцией...

Вызов функций RASDIAL RASEnumConnections RASHangUp с API.
Как вызвать из VB следующие API-функции: RASDIAL RASEnumConnections RASHangUp и другие для того, чтобы написать полнофункциональный...

Почему Microsoft больше не публикует книги по Win32 API? В частности, разработка графического интерфейса с Win32
Кто-нибудь знает, почему Microsoft перестала публиковать книги по программированию Win32 GUI? Я использую электронную книгу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru