Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод кода из VB 6 в VB .NET / C#, OleUIInsertObject 
:(
    Опции темы
Exception
  Дата 2.4.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Прошу о помощи smile
Не получается перевести код с VB 6 на VB .NET / C# (плевать, на что smile ). Как и обычно в таких случаях, речь идёт о проблеме переноса WinAPI-кода.
Задача: заставить RichTextBox показывать окошко 'Insert Object...' и вставлять OLE-объекты (например, MS Equation)
Реализация: есть готовый исходник на VB 6:
Код

 Option Explicit

   ' This is the main API used to display the Insert Obj DlgBox
   Private Declare Function OleUIInsertObject Lib "oledlg.dll" _
   Alias "OleUIInsertObjectA" (inParam As Any) As Long

   ' This is used to get the ProgID from Class ID.
   ' Note that this API need us to pass LPOLESTR * from Visual Basic.
   Private Declare Function ProgIDFromCLSID Lib "ole32.dll" _
   (clsid As Any, strAddess As Long) As Long

   ' The memory allocated OLE way need to be released OLE way
   ' with this API.
   Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pvoid As Long)

   ' Widely used CopyMemory API.
   Private Declare Sub CopyMemory Lib "kernel32" Alias _
   "RtlMoveMemory" (Destination As Any, Source As Any, _
   ByVal Length As Long)

   ' Note that you need to get the strlength of the UNICODE string.
   Private Declare Function lstrlenW Lib "kernel32" _
   (ByVal lpString As Long) As Long

   ' Constants used in the dwFlags of OleUIInsertObjectType.
   Const IOF_SHOWHELP = &H1
   Const IOF_SELECTCREATENEW = &H2
   Const IOF_SELECTCREATEFROMFILE = &H4
   Const IOF_CHECKLINK = &H8
   Const IOF_CHECKDISPLAYASICON = &H10
   Const IOF_CREATENEWOBJECT = &H20
   Const IOF_CREATEFILEOBJECT = &H40
   Const IOF_CREATELINKOBJECT = &H80
   Const IOF_DISABLELINK = &H100
   Const IOF_VERIFYSERVERSEXIST = &H200
   Const IOF_DISABLEDISPLAYASICON = &H400
   Const IOF_HIDECHANGEICON = &H800
   Const IOF_SHOWINSERTCONTROL = &H1000
   Const IOF_SELECTCREATECONTROL = &H2000

   ' Return codes from OleUIInsertObject
   Const OLEUI_FALSE = 0
   Const OLEUI_SUCCESS = 1               ' No error, same as OLEUI_OK.
   Const OLEUI_OK = 1                    ' OK button pressed.
   Const OLEUI_CANCEL = 2                ' Cancel button pressed.

   ' GUID, IID, CLSID, etc
   Private Type GUID
       Data1 As Long
       Data2 As Integer
       Data3 As Integer
       Data4(0 To 7) As Byte
   End Type

   ' Main UDT used in OleUIInsertObject.
   Private Type OleUIInsertObjectType
   ' These IN fields are standard across all OLEUI dialog box functions.
       cbStruct As Long
       dwFlags As Long
       hWndOwner As Long
       lpszCaption  As String    ' LPCSTR
       lpfnHook As Long          ' LPFNOLEUIHOOK
       lCustData As Long         ' LPARAM
       hInstance  As Long
       lpszTemplate As String    ' LPCSTR
       hResource As Long         ' HRSRC
       clsid As GUID

   ' Specifics for OLEUIINSERTOBJECT.
       lpszFile As String        ' LPTSTR
       cchFile As Long
       cClsidExclude As Long
       lpClsidExclude As Long    ' LPCLSID
       IID As GUID

   ' Specifics to create objects if flags say so.
       oleRender As Long
       lpFormatEtc As Long       ' LPFORMATETC
       lpIOleClientSite As Long  ' LPOLECLIENTSITE
       lpIStorage As Long        ' LPSTORAGE
       ppvObj As Long            ' LPVOID FAR *
       sc As Long                ' SCODE
       hMetaPict As Long         ' HGLOBAL
   End Type

   Private Sub Command1_Click()
   Dim UIInsertObj As OleUIInsertObjectType
   Dim retValue As Long
   Dim lpolestr As Long
   Dim strsize As Long
   Dim ProgId As String

   On Error GoTo err

   ' Prepare the OleUIInsertObjectType.
   UIInsertObj.cbStruct = LenB(UIInsertObj)   ' У меня всегда получалась равна 112 в VB 6
   UIInsertObj.dwFlags = IOF_SELECTCREATENEW
   UIInsertObj.hWndOwner = Me.hWnd ' Можно оставить нолик
   UIInsertObj.lpszFile = String(256, " ") ' Функция VB .NET StrDup делает то же самое
   UIInsertObj.cchFile = Len(UIInsertObj.lpszFile) ' = 256

   ' Call the API to display the dialog box.
   retValue = OleUIInsertObject(UIInsertObj) ' Вот тут у меня всегда запарывается

   If (retValue = OLEUI_OK) Then
       ' If we select to insert from a new object
       If ((UIInsertObj.dwFlags And IOF_SELECTCREATENEW) = _
                 IOF_SELECTCREATENEW) Then

       ' You need to get the ProgID.
       ' Note that we pass in a long byref.
         retValue = ProgIDFromCLSID(UIInsertObj.clsid, lpolestr)

       ' The size you need to initialize is the strlen + 1.
         strsize = lstrlenW(lpolestr) + 1
         ProgId = String(strsize, 0)

       ' Copy the string to BSTR. Notice the StrPtr function.
       ' Also notice that every UNICODE char is 2 bytes.
         CopyMemory ByVal StrPtr(ProgId), ByVal lpolestr, strsize * 2

       ' We need to free the memory allocated by ProgIDFromCLSID API.
         CoTaskMemFree lpolestr

         RichTextBox1.OLEObjects.add , , "", ProgId

       Else  ' If we select to insert from file
         RichTextBox1.OLEObjects.add , , UIInsertObj.lpszFile
       End If
      End If

   Exit Sub

   err:
       MsgBox err.Description
   End Sub

К сожалению, портировать структуры на .NET у меня не вышло...
О чём прошу: очень хотелось бы, чтобы кто-нибудь перевёл бы эти структуры на "нормальный язык". У меня не вышло.

Это сообщение отредактировал(а) Exception - 2.4.2006, 19:22
PM   Вверх
mr.DUDA
Дата 2.4.2006, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



А что конкретно не получается ? Делаем struct, ставим над ним [StructLayout(LayoutKind.Sequential)]. Импортируемые функции помечаем как [DllImport].

З.Ы. можно ещё скомпилированную длл-ку рефлектором ковырнуть, получим C# smile


--------------------
user posted image
PM MAIL WWW   Вверх
Exception
Дата 2.4.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Так-с... Про StructLayout я и позабыл smile . Завтра проверю.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.