Страница: 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, это англо-рус. онлайн словарь.
Ксати, к вопросу о том, что "нет кода". А это разве не код?
//
#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-сайт:
Профиль | | #4
Добавлено: 14.08.05 16:46
первый параметр - введенное слово
второй параметр - путь к каталогу с БД
третий параметр - уазатель область памяти (на массив типа: TMorfAnswer)
Номер ответа: 5
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #5
Добавлено: 14.08.05 17:20
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
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #8
Добавлено: 14.08.05 21:31
sne
Там все прозрачно...
У меня уже получилось
Не буду перебивать клиента, если будут проблемы напиши.
Номер ответа: 9
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #9
Добавлено: 15.08.05 03:58
Вызвать - вызвал, но вся проблемма в получении данных... VB.NET не поддерживает ни указателей, ни массивов заданной длинны в UDT, нонче структурах... А может и поддерживает, но я об этом не подозреваю
Если все так как я сказал, прийдется копировать данные вручную и заполнять ими vb.net'овскую структуру...
в любом случае начало положено, копирование на завтра, ибо утро вечера мудренее
Номер ответа: 10
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #10
Добавлено: 15.08.05 05:15
Ага, первого января ))))))))))))))))))
Номер ответа: 11
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #11
Добавлено: 15.08.05 08:30
Да ни фига, всё он поддерживает, только надо атрибутами MarshalAs это ставить...
Номер ответа: 12
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #12
Добавлено: 15.08.05 12:53
Поддерживает. Например.
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-сайт:
Профиль | | #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-сайт:
Профиль | | #15
Добавлено: 15.08.05 15:50
2Ruslan_x, мыло или куда выложить ??