Страница: 1 |
Страница: 1 |
Вопрос: Подключение dll.
Добавлено: 23.12.05 17:38
Автор вопроса: Ruslan_x
Есть код, который отлично идет под VC++.NET.
Вопрос: сложно ли преобразовать этот код так, чтобы он шел под VB.NET?
Главным образом, требуется именно подключение dll.
Я уже много что пытался сделать, но безуспешно. Главное - я не очень представляю, сложная это задача, которую может решить только крутой профессионал, или можно все-таки и любителю разобраться?..
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#using <mscorlib.dll>
using namespace System;
typedef void* (WINAPI *FPINIT) (int, char **);
typedef char* (WINAPI *FPERR) (void*);
typedef char* (WINAPI *FPPARSE) (void*, char*);
typedef void (WINAPI *FPDEL) (void *);
int _tmain (int argc, char **argv)
{
char p[] = "Test string";
HINSTANCE hLib = LoadLibrary("libmecab.dll");
if (hLib) {
FPINIT fpInit = (FPINIT) GetProcAddress(hLib, "mecab_new");
FPERR fpErr = (FPERR) GetProcAddress(hLib, "mecab_strerror");
FPPARSE fpParse = (FPPARSE) GetProcAddress(hLib, "mecab_sparse_tostr");
FPDEL fpDel = (FPDEL) GetProcAddress(hLib, "mecab_destroy");
if (fpInit && fpErr && fpParse && fpDel) {
void *c = (void *)(*fpInit)(argc, argv);
if (!c) {
fprintf (stderr, "Exception %s\n", (*fpErr)(c));
FreeLibrary(hLib);
return -1;
}
printf ("INPUT: %s\n", p);
printf ("RESULT:\n%s", (char *)(*fpParse)(c, p));
(*fpDel)(c);
}
FreeLibrary(hLib);
}
return 0;
}
Саму DLL-ку на всякий случай сюда выложил:
http://hw001.gate01.com/ruslan/other/libmecab.dll
Ответы
Всего ответов: 13
Номер ответа: 1
Автор ответа:
Ruslan_x
Вопросов: 7
Ответов: 41
Профиль | | #1
Добавлено: 23.12.05 17:45
.... Имеется в виду VB.NET 2003.
Номер ответа: 2
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #2
Добавлено: 23.12.05 18:43
Не сложно
sne и я можно сказать специалисты по этому вопросу.
Номер ответа: 3
Автор ответа:
Ruslan_x
Вопросов: 7
Ответов: 41
Профиль | | #3
Добавлено: 23.12.05 19:38
Так можно рассчитывать на вашу помощь?
Или хотя бы подскажите, как правильно объявить переменные:
typedef void* (WINAPI *FPINIT) (int, char **);
typedef char* (WINAPI *FPERR) (void*);
typedef char* (WINAPI *FPPARSE) (void*, char*);
typedef void (WINAPI *FPDEL) (void *);
Буду вам очень признателен.
Номер ответа: 4
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #4
Добавлено: 23.12.05 20:07
Подождем sne. Это была совместная работа.
Номер ответа: 5
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #5
Добавлено: 23.12.05 22:11
можно и умереть пока тут sne дождаться
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 24.12.05 00:02
Меня ждать долго не придется, я не смотря на мою вялую активность читаю форум и в курсе происходящих дел...
ЗЫ
Вообще обычно такое предлагается за денюшку, т.к. время свободного оч. мало... сессия...
Если не к спеху то вполне возможно, а если спешишь, то искать добровольца прийдется, или же объявить вознаграждение некое )
Номер ответа: 7
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #7
Добавлено: 24.12.05 00:14
ЗЫ
Единственное ч чем
повозиться прийдется это с:
typedef void* (WINAPI *FPINIT) (int, char **);
Т.к. тут передается указатель на указатель, прийдется создать
функцию-переходник...
Номер ответа: 8
Автор ответа:
Ruslan_x
Вопросов: 7
Ответов: 41
Профиль | | #8
Добавлено: 24.12.05 06:11
... "функция-переходник"?
Дело ясное, что сам я здесь не разберусь. Хоть с этим теперь понятно.
Сейчас я вообще-то уже использую эту библиотеку совместно с VB.NET. Есть программка к этой DLL-ке, которая работает с файлами. То есть есть входной файл и выходной файл с результатами работы.
Вот через эти файлы я и скармливаю этой библиотеке данные и получаю результаты. Однако, такой подход как-то неаккуратно выглядит. Хотелось бы получить прямой доступ к DLL из VB.NET.
По правде говоря, сейчас с этим особой спешки нет, так что могу подождать, когда у уважаемого sne появится время.
Насчет денюшки. Для меня эта задача не так критична, как в прошлый раз. Так что предложить нормальное вознаграждение не смогу. Единственная надежда на бескорыстную помощь форумчан.
Номер ответа: 9
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #9
Добавлено: 24.12.05 06:45
Дай пример данных, с которыми её можно вызвать и получить нормальный результат, а то вообще непонятно, чё это...
Номер ответа: 10
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #10
Добавлено: 24.12.05 10:50
Обозначь ту сумму, которую можешь предложить.
Возможно, в данной ситуации, она будет вполне приемлемой.
Номер ответа: 11
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #11
Добавлено: 24.12.05 11:50
Раз время терпит, то я бы мог свободно поразбираться в НГ, числа 2, 3 и на халяву Если конечно никто еще не подмагнет... там все равно все отходить будут, делать будет нечего
Номер ответа: 12
Автор ответа:
Ruslan_x
Вопросов: 7
Ответов: 41
Профиль | | #12
Добавлено: 24.12.05 18:51
Дай пример данных, с которыми её можно вызвать и получить нормальный результат, а то вообще непонятно, чё это...
Пожелание вполне понятное.
Вообще-то эта библиотека для разбиения на отдельные слова текста на японском языке. Возможно, некоторые знают, что в яп. языке между словами нет пробелов. И строчка представляет из себя неразрывный поток символов.
Для компьютерной обработки и нужна эта библиотека, которая как бы вставляет пробелы между словами. Проблема в том, что довольно непросто понять, где кончается одно слово и начитается другое.
--------
Короче говоря, в ближайшее время постараюсь выложить пример реальной работы этой библиотеки - чтобы было более понятно, о чем речь.
Номер ответа: 13
Автор ответа:
Ruslan_x
Вопросов: 7
Ответов: 41
Профиль | | #13
Добавлено: 26.12.05 18:23
На VC++.NET заработало, но есть пара нюансов:
- библиотека требует входной текст в яп. формате Shift-JIS (отличный от UTF-8)
- библиотека требует конфигурационный файл, который должен быть расположен в фиксированном месте (C:\Program Files ...)
- к тому же для работы нужно еще подключать словарь (довольно объемный)
Одним словом, решил я пока закрыть этот вопрос. Слишком много заковырок, которые к делу не относятся. К тому же, скоро обещают выпустить новую версию библиотеки. Тогда, возможно, вернусь к этому же вопросу.
В любом случае, мои благодарности всем ответившим и конкретно sne.