Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Вызов DLL. За ответ плачу $50. Добавлено: 14.08.05 15:18  

Автор вопроса:  Ruslan_x
Итак, проблема.
-------------------
Есть библиотека морфологического анализатора (mtlemm.dll), которая находится по адресу:

http://www.multitran.ru/DownLoad/lemm.zip


Описания к ней здесь:

http://www.multitran.ru/c/m.exe?a=DownloadFile&HL=2
http://www.multitran.ru/c/m.exe?a=DisplayFile&q=MtLemmInstructions


В архиве lemm.zip есть также пример использования этой библиотеки (mtlemm.dll), но пример этот написан на Microsoft Visual C++ 6.0.

**********************
Задача: нужно заставить работать эту библиотеку из-под VB.NET 2003.
**********************

Я связался с автором этого анализатора, но
он не смог мне помочь, так как сам не разбирается в VB.NET.

Библиотека, кажется, написана на C.

Если кто-то сможет помочь мне подключить эту библиотеку к VB.NET 2003, то вышлю ответившему $50.

Способ оплаты:
1) Paypal
2) Яндекс.Деньги

Ответить

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

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



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 14.08.05 15:50
Гы гы гы...

В ресурсах куча диалогов, при этом кода в них нет.
В библиотеке 1 (одна) функция с тремя параметрами, два на вход, один на выход.

Точно этот автор библиотеки является её автором? Просто случай тривиален с точки зрения организации передачи. Неясно только что передавать в качестве byte *buff.

Ответить

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



Вопросов: 7
Ответов: 41
 Профиль | | #2 Добавлено: 14.08.05 16:31
В ресурсах куча диалогов, при этом кода в них нет.


Там есть папка Test_Mtlemm, в которой содержатся исходники для программы на С++. Эта программа показывает, как работать с данной библиотекой. Поскольку я в С++ совершенно не разбираюсь, поэтому и обратился к более знающим товарищам.


Точно этот автор библиотеки является её автором?


Несколько неясен вопрос. А автором этой библиотеки действительно является владелец ресурса www.multitran.ru, это англо-рус. онлайн словарь.


Ксати, к вопросу о том, что "нет кода". А это разве не код?



// test_mtlemmDlg.cpp : implementation file
//
#include "stdafx.h"
//#include "lemm.h"
//#include "lang.h"
#include "test_mtlemm.h"
#include "test_mtlemmDlg.h"
//#include "..\resource.h"
//#include "noclass.h"
//#include "SikWords.h"
//#include "EditEntr.h"
//#include "tmorf.h"
//#include "stress.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest_mtlemmDlg dialog

CTest_mtlemmDlg::CTest_mtlemmDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTest_mtlemmDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTest_mtlemmDlg)
m_Word = _T("";);
m_Stress = _T("";);
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTest_mtlemmDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTest_mtlemmDlg)
DDX_Control(pDX, IDC_FORMS, m_FormList);
DDX_Control(pDX, IDC_VARIANT_LIST, m_VariantList);
DDX_Text(pDX, IDC_WORD, m_Word);
DDX_Text(pDX, IDC_STRESS, m_Stress);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTest_mtlemmDlg, CDialog)
//{{AFX_MSG_MAP(CTest_mtlemmDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_SELCHANGE(IDC_FORMS, OnSelchangeForms)
ON_LBN_SELCHANGE(IDC_VARIANT_LIST, OnSelchangeVariantList)
ON_BN_CLICKED(IDC_SAME_SIK, OnSameSik)
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest_mtlemmDlg message handlers

BOOL CTest_mtlemmDlg::OnInitDialog()
{
CDialog::OnInitDialog();

#if 1 // ???
// GetModuleFileName (NULL, data.m_datapath.Assign (256), 256);
// data.m_datapath.ExtractPath();
#else
data.m_datapath = "d:\\mt\\network\\";
#endif
// ReadMultitranRegistrySection();


// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
}

// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTest_mtlemmDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTest_mtlemmDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTest_mtlemmDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void SaveSystemUpdate(){}
int PerformSystemUpdate(){return 0;}
#if 0
void CTest_mtlemmDlg::OnTest1()
{
HINSTANCE hLib = LoadLibrary("mtlemm.dll";);
ASSERT(hLib);
DWORD (CALLBACK* pfnMtLemmFunc1)(byte *buff, byte *datapath, struct TMorfAnswer *TMorfAnswerPtr);
(FARPROC&;)pfnMtLemmFunc1 = GetProcAddress(hLib, "MtLemmFunc1";);
ASSERT(pfnMtLemmFunc1);
byte buff[] = "code";
struct TMorfAnswer TMorfAnswer1[100];
int res = pfnMtLemmFunc1 (buff, "", &TMorfAnswer1[0];);
FreeLibrary(hLib);
}
#endif

#define byte char
void CTest_mtlemmDlg::OnOK()
{
UpdateData (TRUE);
byte buff[256];
UpdateData (FALSE);

HINSTANCE hLib = LoadLibrary ("mtlemm.dll";);
if (hLib == NULL) {
AfxMessageBox ("Cannot open mtlemm.dll";);
return;
}
ASSERT(hLib);
DWORD (CALLBACK* pfnMtLemmFunc1)(byte *buff, byte *datapath, struct TMorfAnswer *TMorfAnswerPtr);
(FARPROC&;)pfnMtLemmFunc1 = GetProcAddress(hLib, "MtLemmFunc1";);
ASSERT(pfnMtLemmFunc1);

// Морфологическая база расположена в директории Database
// той директории, где находится exe-файл
byte path[512];
GetModuleFileName (NULL, path, 512);
for (int i = strlen(path); i; i --) {
if (path[i] == '\\') {
path[i + 1] = 0;
break;
}
}
strcat (path, "database";);
// Морфологическая база расположена в другой директории
// strcpy (path, "c:\\testmtLemm";);

strcpy (buff, m_Word.GetBuffer(256));
int res = pfnMtLemmFunc1 (buff, path, &m_TMorfAnswer[0];);
// SetWindowText (path); // check used path

m_VariantList.ResetContent();
m_FormList.ResetContent();
if (!res) {
m_VariantList.AddString (":( Слово не найдено";);
return;
}
else if (res < 0) {
AfxMessageBox ("Не найден морфологический словарь";);
}

for (i = 0; i < res; i ++) {
m_VariantList.AddString (m_TMorfAnswer[i].m_MainForm);
// Cbyte buff = "Variant ";
// buff += intochar (i);
// m_VariantList.AddString (TMorfAnswerPtr->m_MainForm.b);
}
FreeLibrary(hLib);
m_VariantList.SetCurSel(0);
OnSelchangeVariantList();
}

void CTest_mtlemmDlg::OnSelchangeForms()
{
}

void CTest_mtlemmDlg::OnSelchangeVariantList()
{
m_FormList.ResetContent();
int sel = m_VariantList.GetCurSel();
if (sel < 0) return;
struct TMorfAnswer *TMorfAnswerPtr;
TMorfAnswerPtr = &m_TMorfAnswer[sel];
UpdateData (FALSE);

byte buff[] = "LGK ";
m_CurSik = TMorfAnswerPtr->m_MyLinfo.sik;

if (TMorfAnswerPtr->SClass == Substantives)
m_FormList.AddString ("Существительное";);
else if (TMorfAnswerPtr->SClass == Verbs)
m_FormList.AddString ("Глагол";);
else if (TMorfAnswerPtr->SClass == Adjectives)
m_FormList.AddString ("Прилагательное";);
else if (TMorfAnswerPtr->SClass == CompDegreeAdjectives)
m_FormList.AddString ("Прилагательное (сравнительная степень)";);
else if (TMorfAnswerPtr->SClass == ShortAdjectives)
m_FormList.AddString ("Прилагательное (краткая форма)";);
else if (TMorfAnswerPtr->SClass == Adverbs)
m_FormList.AddString ("Наречие";);
else if (TMorfAnswerPtr->SClass == Participles)
m_FormList.AddString ("Причастие";);
else if (TMorfAnswerPtr->SClass == Adverbs)
m_FormList.AddString ("Наречие";);
else if (TMorfAnswerPtr->SClass == Prepositions)
m_FormList.AddString ("Предлог";);
else if (TMorfAnswerPtr->SClass == Conjunctions)
m_FormList.AddString ("Союз";);
else if (TMorfAnswerPtr->SClass == Particles)
m_FormList.AddString ("Частица";);
else if (TMorfAnswerPtr->SClass == PersonalPronouns)
m_FormList.AddString ("Личное местоимение";);
else if (TMorfAnswerPtr->SClass == Interjections)
m_FormList.AddString ("Междометие";);
else if (TMorfAnswerPtr->SClass == CardinalNumbers)
m_FormList.AddString ("Количественное числительное";);

if (TMorfAnswerPtr->Animation == eaAnimated)
m_FormList.AddString ("Одушевленное";);
else if (TMorfAnswerPtr->Animation == eaUnAnimated)
m_FormList.AddString ("Неодушевленное";);

if (TMorfAnswerPtr->Number == enSingle)
m_FormList.AddString ("Единственное число";);
else if (TMorfAnswerPtr->Number == enMultiple)
m_FormList.AddString ("Множественное число";);

if (TMorfAnswerPtr->Gender == egMasculine)
m_FormList.AddString ("Мужской род";);
else if (TMorfAnswerPtr->Gender == egFeminine)
m_FormList.AddString ("Женский род";);
else if (TMorfAnswerPtr->Gender == egNeuter)
m_FormList.AddString ("Средний род";);

if (TMorfAnswerPtr->Case == ecNominative)
m_FormList.AddString ("Именителный падеж";);
else if (TMorfAnswerPtr->Case == ecGenitive)
m_FormList.AddString ("Родительный падеж";);
else if (TMorfAnswerPtr->Case == ecDative)
m_FormList.AddString ("Дательный падеж";);
else if (TMorfAnswerPtr->Case == ecAccusative)
m_FormList.AddString ("Винительный падеж";);
else if (TMorfAnswerPtr->Case == ecInstrumental)
m_FormList.AddString ("Творительный падеж";);
else if (TMorfAnswerPtr->Case == ecPrepositional)
m_FormList.AddString ("Предложный падеж";);

if (TMorfAnswerPtr->Aspect == easPerfect)
m_FormList.AddString ("Совершенный вид";);
else if (TMorfAnswerPtr->Aspect == easImperfect)
m_FormList.AddString ("Несовершенный вид";);

if (TMorfAnswerPtr->Mood == emInfinitive)
m_FormList.AddString ("Неопределенная форма";);
else if (TMorfAnswerPtr->Mood == emPast)
m_FormList.AddString ("Прошедшее наклонение";);
else if (TMorfAnswerPtr->Mood == emPresent)
m_FormList.AddString ("Настоящее наклонение";);
else if (TMorfAnswerPtr->Mood == emImperative)
m_FormList.AddString ("Повелительное наклонение";);

if (TMorfAnswerPtr->Person == epFirst)
m_FormList.AddString ("Первое лицо";);
else if (TMorfAnswerPtr->Person == epSecond)
m_FormList.AddString ("Второе лицо";);
else if (TMorfAnswerPtr->Person == epThird)
m_FormList.AddString ("Третье лицо";);

if (TMorfAnswerPtr->Time == etPast)
m_FormList.AddString ("Прошедшее время";);
else if (TMorfAnswerPtr->Time == etPresent)
m_FormList.AddString ("Настоящее время";);
else if (TMorfAnswerPtr->Time == etFuture)
m_FormList.AddString ("Будущее время";);


if (TMorfAnswerPtr->SClass == AdverbialParticiples)
m_FormList.AddString ("Деепричастие";);

if (TMorfAnswerPtr->Alternative == ealYes)
m_FormList.AddString ("--- Дополнительная форма";);
}


void CTest_mtlemmDlg::OnSameSik()
{
// CSikWords SW;
// SW.m_StartType = FIND_SIK;
// SW.m_SikLine = intochar (m_CurSik);
// SW.m_AutoSearch = 1;
// SW.DoModal();
}

void CTest_mtlemmDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default

CDialog::OnClose();
}

Ответить

Номер ответа: 3
Автор ответа:
 Ruslan_x



Вопросов: 7
Ответов: 41
 Профиль | | #3 Добавлено: 14.08.05 16:38
Наверное, самое главное здесь:
----------------------

void CTest_mtlemmDlg::OnTest1()
{
HINSTANCE hLib = LoadLibrary("mtlemm.dll";);
ASSERT(hLib);
DWORD (CALLBACK* pfnMtLemmFunc1)(byte *buff, byte *datapath, struct TMorfAnswer *TMorfAnswerPtr);
(FARPROC&;)pfnMtLemmFunc1 = GetProcAddress(hLib, "MtLemmFunc1";);
ASSERT(pfnMtLemmFunc1);
byte buff[] = "code";
struct TMorfAnswer TMorfAnswer1[100];
int res = pfnMtLemmFunc1 (buff, "", &TMorfAnswer1[0];);
FreeLibrary(hLib);
}

Ответить

Номер ответа: 4
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 14.08.05 16:46
первый параметр - введенное слово
второй параметр - путь к каталогу с БД
третий параметр - уазатель область памяти (на массив типа: TMorfAnswer)

Ответить

Номер ответа: 5
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #5
Добавлено: 14.08.05 17:20
struct  mylinfo {
    curword as integer
    sik as integer
    OkFormCount as integer'
    basesize as integer'
    maxtrans as integer'
//   int maxphrase'
    mainlgk as integer ''  // for participles = P_VERB
    lgk as integer ''      // for participles = P_ADJECTIVE
//   unsigned char match'
   result as integer'
   m_DuplicateForm as integer'
   wordnum as integer'
   offset as integer'
   wordcase as integer'
   basecase as integer '   // case in stem dictionary
   prich_type as integer'
// int used'
// int subject'
yo_to_e_replacement_position as integer'
e_to_yo_replacement_position as integer'
// Cbyte stem'
   next as integer'  // указатель на следующую стуруктуру этого эе типа
end type

type TCaseFrame
  Trans as string ' На худой конец это надо заменить на ineteger... т.е. тут хранится указатель на строку
  Case_Frame as string'
end type

type TMorfAnswer
  m_MainForm(50) as byte'
  EnSClass as integer'
  EnAnimation as integer'
  EnGender as integer'
  EnNumber as integer'
  EnCase as integer'
  EnAlternativeForm as integer'
  EnAspect as integer'
  EnPerson as integer'
  EnVoice as integer'
  EnReflection as integer'
  EnTime as integer'
  EnMood as integer'
  EnComparativeDegree as integer'
  CaseFrames as TCaseFrame'
  size as integer'
  wordnum as integer'
  m_MyLinfo as mylinfo'
end type


а вот и типы...

ЗЫ
к сожалению сейчас студии не стоит, так что и посмотреть эту тестовую программу в действии и более точно перевести код, и написать пример сегодня у меня не получится...

Ответить

Номер ответа: 6
Автор ответа:
 Ruslan_x



Вопросов: 7
Ответов: 41
 Профиль | | #6 Добавлено: 14.08.05 19:21
написать пример сегодня у меня не получится


С нетерпением жду.

Ответить

Номер ответа: 7
Автор ответа:
 ViktorZ



ICQ: 271202919 

Вопросов: 56
Ответов: 837
 Профиль | | #7 Добавлено: 14.08.05 20:40
sne Rockfeller 8-)))

Ответить

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



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

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #8
Добавлено: 14.08.05 21:31
sne
Там все прозрачно...
У меня уже получилось:)
Не буду перебивать клиента, если будут проблемы напиши.

Ответить

Номер ответа: 9
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #9
Добавлено: 15.08.05 03:58
Вызвать - вызвал, но вся проблемма в получении данных... VB.NET не поддерживает ни указателей, ни массивов заданной длинны в UDT, нонче структурах... А может и поддерживает, но я об этом не подозреваю :)

Если все так как я сказал, прийдется копировать данные вручную и заполнять ими vb.net'овскую структуру...

в любом случае начало положено, копирование на завтра, ибо утро вечера мудренее :)

Ответить

Номер ответа: 10
Автор ответа:
 Morpheus



Вопросов: 224
Ответов: 3777
 Web-сайт: xury.zx6.ru
 Профиль | | #10
Добавлено: 15.08.05 05:15
утро вечера мудренее

Ага, первого января :)))))))))))))))))))

Ответить

Номер ответа: 11
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #11 Добавлено: 15.08.05 08:30
Да ни фига, всё он поддерживает, только надо атрибутами MarshalAs это ставить...

Ответить

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



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

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #12
Добавлено: 15.08.05 12:53
Поддерживает. Например.
Public Structure TMorfAnswe
            Public a As Integer
            Public b As Integer
            Public c() As Integer
            Public Sub main()
                Dim a As Integer = 3
            End Sub
        End Structure

        Public Sub z()
            Dim x(100) As TMorfAnswe
            x(1).a = 0
            'и.т.д.
        End Sub


Только sne воткнешься мне кажется несколько в другом.

Ответить

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



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

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #13
Добавлено: 15.08.05 13:43
sne
Обрати внимание.
Прошрамма и библиотка написаеа на С++ под MFC.
В прграмме - тестере показан пример позднего(динамичского) связывания.
Я думаю пока достаточно, а то заказчик сам напишет:)

Ответить

Номер ответа: 14
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #14 Добавлено: 15.08.05 14:29
Какая разница, что за чушь там написана в примере?
Библиотека экспортирует функцию, это главное.

Ответить

Номер ответа: 15
Автор ответа:
 sne



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #15
Добавлено: 15.08.05 15:50
2Ruslan_x, мыло или куда выложить ??

Ответить

Страница: 1 | 2 |

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



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