Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Помогите перевести с VС++ в VB.net или VB Добавлено: 11.01.06 21:57  

Автор вопроса:  AlexM | ICQ: 207239324 
SkyOpen / инициализация карты /
int SkyOpen(char* Name);
применение:
int (WINAPIV* SkyOpen)(char*);

HMODULE skydll; char SS2Name[1000];
skydll=LoadLibrary("SkyDll.dll");(FARPROC&)SkyOpen=GetProcAddress(skydll,"SkyOpen");
if(SkyOpen(SS2Name)) return 0;

примечание:
результат выполнения = 0 если нет ошибокName (PChar)

Вот мои наработки

Option Strict Off
Option Explicit On
Friend Class Form1
Inherits System.Windows.Forms.Form

Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Integer) As Integer
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA"(ByVal lpLibFileName As String) As Integer
Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Integer, ByVal lpProcName As String) As Integer
    Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As String) As Long

    Private Declare Auto Function SkyOpen Lib "SkyDll.dll" () As Char

    Private Const ERROR_SUCCESS As Short = &H0S

    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
        On Error Resume Next
        Dim SkyDll As Long, SkyOpen As Long


        Dim SS2Name() As Char
        ReDim SS2Name(1000)

        SkyDll = LoadLibrary("SkyDll.dll")


        SkyOpen = GetProcAddress(SkyDll, "SkyOpen")


    End Sub

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #1
Добавлено: 11.01.06 23:48
Почему не воспользоваться импортом?

Imports System.Runtime.InteropServices

<;DllImport("SkyDll.dll", EntryPoint:="SkyOpen", SetLastError:=True, _
          CharSet:=CharSet.Ansi, ExactSpelling:=True, _
        CallingConvention:=CallingConvention.StdCall)> _
        Public Shared Function Fun(ByVal  SS2Name( ) As Char) As Integer


        End Function


При вызове потребуется скрее всего использовать маршаплинг.

<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=1000)> _
                                    Dim SS2Name() As Char


Вызов будет выгляеть примерно так.

If Fun(SS2Name) Then
            Return 0
        End If


Только сразу оговорюсь, что это общий шаблон.

Ответить

Номер ответа: 2
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #2
Добавлено: 13.01.06 02:17
Если у тебя всё известно на стадии проектирования, не лучше ли сразу внести функцию в таблицу импорта:
Private Declare Sub SkyOpen Lib "SkyDll.dll";()

Разумеется, если там есть какие-то параметры, то их тоже надо объявить. Если не можешь сам, приведи оригинальный кусок вызова на С++.
Кстати, на си-пи-пи эту хрень мутили, почти наверняка по причине отсутствия h и lib файлов прилагающихся к библиотеке. На VB прога инициализирует адреса функций при первом вызове (как я понимаю), поэтому эти апишки надо использовать только в случае использования, к примеру плагинов - при динамическом подключении библиотек.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам