Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизИнтерфейс объекта VisualFoxPro.Application в составе vfpXr.dll Найти похожие ветки
← →
Сергей М. © (2007-04-23 11:49) [0]Как получить программный доступ к этому интерфейсу, имея? r ghbvthe? доступ к интерфейсу объекта VisualFoxPro.Runtime ?
← →
umbra © (2007-04-23 12:11) [1]а какая версия фокспро? и из какой библиотеки VisualFoxPro.Runtime?
← →
Сергей М. © (2007-04-23 12:27) [2]
> umbra © (23.04.07 12:11) [1]
Ну, скажем, vfp6 ..
Это, думаю, не принципиально..
← →
Сергей М. © (2007-04-23 12:42) [3]Ноги у вопроса растут отсюда:
http://qcomponents.by.ru/foxdset.htm
← →
umbra © (2007-04-23 12:52) [4]а такое не работает разве?
procedure TForm1.Button1Click(Sender: TObject);
var
vfp: Variant;
begin
vfp := CreateOleObject("VisualFoxPro.Application");
vfp.Visible := True;
end;
← →
Сергей М. © (2007-04-23 12:55) [5]
> umbra © (23.04.07 12:52) [4]
Конечно не работает)
Иначе и вопроса бы ни было.
← →
umbra © (2007-04-23 12:59) [6]гм. А у меня работает. Какую ошибку выдает?
← →
Сергей М. © (2007-04-23 13:05) [7]
> А у меня работает
Потому что у тебя, очевидно, инсталлирована сама среда разработки.
А у меня не инсталлирована.
И автор FoxDSet"а (см. [3]) тоже не требует инсталляции среды, для работы его софта необходимо лишь наличие рантайм-библиотеки из состава среды. Мало того, FoxDSet не требует даже регистрации рантайм-библиотеки в реестре.
← →
umbra © (2007-04-23 13:06) [8]собственно, самого фокспро у меня нет, но в в папке system нашлась vfp6r.dll, я ее зарегистрировал, и приведенный код показал мне окошко среды фокспро.
← →
Сергей М. © (2007-04-23 13:08) [9]
> Какую ошибку выдает?
Ту же самую, которая выдается при запросе на создание любого объекта, имя класса которого не фигурирует в реестре.
← →
Сергей М. © (2007-04-23 13:13) [10]
> umbra © (23.04.07 13:06) [8]
Если так, то приведи, пож., все записи в реестре, имеющие отношение к зарегистрированному при этом классу VisualFoxPro.Application ...
← →
Сергей М. © (2007-04-23 13:39) [11]Вот регистрационная инф-ция в моем случае.
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{008B6021-1F3D-11D1-B0C8-00A0C9055D74}]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{008B6021-1F3D-11D1-B0C8-00A0C9055D74}\InProcServer32]
@="C:\\WINDOWS\\system32\\VFP6R.DLL"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{008B6021-1F3D-11D1-B0C8-00A0C9055D74}\ProgId]
@="VisualFoxpro.Runtime.6"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{008B6021-1F3D-11D1-B0C8-00A0C9055D74}\VersionIndependentProgId]
@="VisualFoxpro.Runtime"
Как видишь, никаких VisualFoxPro.Application не наблюдается.
Чем твоя vfp6r.dll отличается от моей, если твоя регистрирует этот объект, а моя нет ?
Уверен что ничем)
← →
umbra © (2007-04-23 14:00) [12]виноват, нашелся экзешник фокспро на компьютере. И вышеприведенный код работает только когда этот экзешник зарегистрирован.
Попытки создать объект VisualFoxPro.Runtime (из vfp6r.dll) приводит к сообщению "интерфейс не поддерживается", хотя библиотека есть в реестре. Это наводит на мысль, что при создании объекта требуется некое условие, которое не выполняется, если вызов идет из стороннего приложения. А автор FoxDSet вычислил это условие и написал загрузчик для vfp6r.dll в виде своей foxauto.dll.
← →
Сергей М. © (2007-04-23 14:07) [13]
> Попытки создать объект VisualFoxPro.Runtime (из vfp6r.dll)
> приводит к сообщению "интерфейс не поддерживается", хотя
> библиотека есть в реестре
Разумеется, не поддерживается !
Ибо объект VisualFoxPro.Runtime не реализует IDispatch.
В том-то и состоит вопрос.
> автор FoxDSet вычислил это условие и написал загрузчик для
> vfp6r.dll в виде своей foxauto.dll
Все верно.
Вот меня как раз и интересует, как, по аналогии с foxauto.dll, грамотно воспользоваться ф-циями DllWinMain и DllOleInit с этой целью ..
← →
Сергей М. © (2007-04-24 10:24) [14]Хорошо, поставим вопрос так - какими "движками" (если не vfp run-time) можно воспользоваться для быстрой и корректной реиндексации фоксовых таблиц с CDX-индексами ?
← →
sniknik © (2007-04-24 10:51) [15]Halcyon - ом пользовался когдато... не для CDX правда, для клиперных индексов, но поддержка CDX тоже есть.
не нравится "корректность" можеш исправить, он с исходниками на дельфе (один раз приходилось, но не изза Halcyon-а, две версии клипера почемуто делали различные индексы на одинаковом выражении, пришлось подстраиваться)
не нравится "быстрость" пользуйся непосредственно фоксом, никто быстрее его с его таблицами/индексами не работает.
← →
Сергей М. © (2007-04-24 11:25) [16]
> sniknik © (24.04.07 10:51) [15]
> можеш исправить .. он с исходниками на дельфе
Цитата с дом.страницы:
Price: $100.00 US Complete source code is included in the purchase price.
Это мне никак не подходит, тем более при условии, что придется потенциально "править" это добро.
> не нравится "быстрость" пользуйся непосредственно фоксом,
> никто быстрее его с его таблицами/индексами не работает
Так ведь я о фоксе (точнее - о его ран-тайм-движке) речь и веду в первую очередь !
← →
umbra © (2007-04-24 13:12) [17]в foxauto.dll, если я не ошибаюсь, ф-ция GetClassObject определена как
HRESULT __stdcall DllGetClassObject(const CLSID *const rclsid,const IID *const riid,LPVOID *ppv)
В ней из vfp6r.dll вызываются сначала DllOleInit с тремя параметрами (один из которых - имя какого-то файла, с двумя остальными еще не разобрался), а затем VFPGetClassObject c rclsid, riid и ppv в качестве параметров
← →
Сергей М. © (2007-04-24 13:56) [18]
> umbra © (24.04.07 13:12) [17]
>
> в foxauto.dll, если я не ошибаюсь, ф-ция GetClass
> из vfp6r.dll вызываются сначала DllOleInit
Хм ..
А вот фриварная фоксовая утилитка DBFPacker, по сведениям ее предвар.трассировки мной, вызывает DllOleInit лишь единожды перед самым завершением своей работы.
> один из которых - имя какого-то файла
К примеру, в случае с тем же DBFPacker"ом это полный путь к DBFPacker.exe ..
← →
Сергей М. © (2007-04-28 13:54) [19]Решил пока остановиться на варианте связки "FoxOLEDataSet+foxauto+vfpXruntime" и потестировать, благо отучить автора FoxOLEDataSet от жадности - один байт в его коде подправить)
Дышать-то она дышит, но проблема с кодировкой - интересующие DBF сверстаны в cp866.
Фоксовик из меня никакой, посему прошу бывалых фоксовиков подсказать, где и что надо "ковырнуть"..
← →
Сергей М. © (2007-04-28 14:42) [20]Судя по молчанию, "бывалые фоксовики" то ли на Канарах, то ли отсутствуют как класс ?)
← →
sniknik © (2007-04-28 15:24) [21]> Судя по молчанию, "бывалые фоксовики" то ли на Канарах, то ли отсутствуют как класс ?)
они давно стали "бывшими фоксовиками"...
и кстати, многие движки не обращают внимания на байт кодировки в таблице... (исторически сложилось, в первых версиях его попросту не было) поэтому ты легко можеш получить таблицу в которое "e" (винда, ansi вроде) стоит, а фактически данные в OEM DOS. или наоборот. в итоге "правильные" движки четко следующие байту исковеркают данные до неузнаваемости... поэтому есть внешние приоритетные параметры. в фоксе вроде есть sql команда меняющая кодировку типа SET COLLATE TO MACHINE (либо устанавливать в строке конекта, что тебе судя по всему не пойдет)
← →
sniknik © (2007-04-28 15:30) [22]> что придется потенциально "править" это добро.
ну что за люди... а? ему говоришь, есть возможность менять т.к. с исходниками, он понимает что ему придется "править". т.е. достоинство "легким движением пера" превращается в недостаток... с чего решил что придется? я разве это говорил?
← →
Сергей М. © (2007-04-28 16:57) [23]
> sniknik © (28.04.07 15:24) [21]
SET COLLATE TO "чегого-то там"- да, есть такая. Но причем здесь сортировка ?
> либо устанавливать в строке конекта, что тебе судя по всему
> не пойдет
Именно в т.н. "строке коннекта" оно бы и подошло. Точнее, не в строке коннекта, а в указанном мной фокс-скрипте, автоматически выполняемом при коннекте к COM-серверу FoxApplication.
← →
sniknik © (2007-04-28 17:07) [24]> Но причем здесь сортировка ?
и действительно причем? учитывая то что ответ на [19], в котором "жалобы" на кодировку...
> а в указанном мной фокс-скрипте,
из комманд типа упомянутой как раз и состоит любой "фокс-скрипт"... а вот когда он выполняется при коннекте или после, автоматически или нет, это неважно. и никакого отношения скрип к строке коннекта не имеет.
← →
Сергей М. © (2007-05-02 08:53) [25]
> sniknik © (28.04.07 17:07) [24]
> есть внешние приоритетные параметры. в фоксе вроде есть
> sql команда меняющая кодировку типа SET COLLATE TO MACHINE
SET COLLATE TO "MACHINE" никак не меняет ситуации.
SET COLLATE TO "RUSSIAN" вызывает ошибку вида "Указанная последовательность сортировки не найдена"
Куда копать дальше ?
> а вот когда он выполняется при коннекте или после
В таком случае надо бы расставить "точки над " - что есть "коннект" и "строка коннекта" в случае использования vfpr как внутреннего объекта автоматизации ..
← →
Сергей М. © (2007-05-02 10:44) [26]Судя по http://www.foxclub.ru/sol/index.php?act=view&id=269, фоксовое ядро, начиная с 6-й версии, должно использовать файл конфигурации CONFIG.FPW, в котором как раз и можно указать явно текущуя используемуя кодовуя страницу.
Но эксперименты показывают, что vfp7r в ходе работы в кач-ве сервера автоматизации не обращается к этому файлу ни в какой момент времени..
← →
sniknik © (2007-05-02 10:50) [27]> SET COLLATE TO "RUSSIAN" вызывает ошибку вида "Указанная последовательность сортировки не найдена"
установка "колатиона" сама по себе ошибки давать не должна (и не дает судя по всему, так максимум чего ожидал бы это "ошибка синтаксиса. нет такой команды" или "не найден "колатион" "RUSSIAN"")
ошибка от чегото другого, либо у тебя там есть order by ... , либо он сам пытается применить/переделать индексы открытым таблицам, либо... действительно проверяет соответствие будущих сортировок и не находит установленных русских частей (не знаю чего ему там нужно, но собран твой обьект на английской винде английским же фоксом без "левых" для него языков)
p.s. теперь понятно откуда раньше взялось > "Но причем здесь сортировка ?"... (лучше позно чем никогда) :), только COLLATE это не сортировка.
> В таком случае надо бы расставить "точки над " - что есть "коннект" и "строка коннекта"
расставь кто тебе не дает? "расставить" можеш только ты, только у тебя информация и о том что ты имееш ввиду в "случае использования vfpr ...", и инфа о строке коннекта, как она есть в общеупотребимом смысле (в ADO, OLEDB). у меня есть только вторая часть и догадки по первой.
← →
Сергей М. © (2007-05-02 11:10) [28]
> sniknik © (02.05.07 10:50) [27]
Ты, похоже, вообще не вник в проблему, раз тебя понесло на "либо у тебя там есть order by")
> только у тебя информация и о том что ты имееш ввиду в "случае
> использования vfpr ..."
vfpr = Visual FoxPro Runtime Library = Библиотека фабрики класса VisualFoxpro.Runtime.
← →
Проходил мимо (2007-05-02 11:50) [29]Для замены кодировки в dbf-файле c 866 на 1251:
local lnFHnd
m.lnFHnd = fopen(<<dbf-file - полный путь>>)
if m.lnFHnd # -1
Fseek(m.lnFHnd, 29)
Fputs(m.lnFHnd, Chr(201), 1) && если надо наоборот - Chr(101)
Fclose(m.lnFHnd)
endif
P\S на fox"е написано :)
← →
sniknik © (2007-05-02 12:22) [30]> Ты, похоже, вообще не вник в проблему, раз тебя понесло на "либо у тебя там есть order by")
согласен... я вообще часто не вижу проблем там где их видят другие. для этого видать талант нужен.
> vfpr = Visual FoxPro Runtime Library = Библиотека фабрики класса VisualFoxpro.Runtime.
зачем эта расшифровка, что такое vfpr? (само по себе неплохо, но запоздало) когда говорили про "строку коннекта" к нему... или... это и есть его строка коннекта?
Проходил мимо (02.05.07 11:50) [29]
а если файл старый или перепутано (как в [21] описано)?
или еще вариант программе "оригиналу" (есть догадка о работе "в пару", иначе с чего за этот формат так "держаться"?) не пофигу что там установлено?
← →
Сергей М. © (2007-05-02 12:51) [31]
> Проходил мимо (02.05.07 11:50) [29]
Я не спрашивал, как изменить кодировку в самом контейнере.
Так что - проходи мимо)
> sniknik © (02.05.07 12:22) [30]
> это и есть его строка коннекта?
Это не "строка коннекта")
Ты вообще о коннекте к чему, к базе ?
Хорошо, ткни меня носом как она должна выглядеть, если я имею доступ к интерфейсу OLE-объекта VisualFoxPro.Application и желаю его средствами получить доступ к некоей FoxPro-таблице в кодировке 866..
← →
sniknik © (2007-05-02 13:10) [32]> Ты вообще о коннекте к чему, к базе ?
можно к базе, можно к файлам, ADO OLEDB
типа (это к файлам) OLEDB
Provider=VFPOLEDB.1;Data Source=D:\DB;Password="";Collating Sequence=MACHINE
или тоже самое ODBC
Provider=MSDASQL.1;Persist Security Info=False;Extended Properties="DSN=Visual FoxPro Tables;UID=;SourceDB=d:\DB;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Colla te=Machine;Null=Yes;Deleted=Yes;"
> если я имею доступ к интерфейсу OLE-объекта VisualFoxPro.Application
а вот про это я ничего не говорил, кроме того что скрипт в который ты мог запихнуть sql команду "SET COLLATE TO MACHINE" никакого отношения к строке коннекта не имеет.
а вот как ты его подключаешь и что имел ввиду под "строкой коннекта" для него... откуда я знаю? это же ты делаешь. я с этим не работал (и не хочу начинать. особенно после того как контора с фоксом накрепко "завязала").
← →
Сергей М. © (2007-05-02 14:01) [33]
> sniknik © (02.05.07 13:10) [32]
ADO OLEDB/ODBC можно было и не упоминать, ибо с его строками коннекта все ясно. Но об ADO речь в сабже вовсе не идет.
> откуда я знаю? .. я с этим не работал
Но тогда это как-то не вяжется с твоим утверждением
> не нравится "быстрость" пользуйся непосредственно фоксом,
> никто быстрее его с его таблицами/индексами не работает
)
Прочем, как видишь, я как раз и пытаюсь воспользоваться "непосредственно фоксом"
← →
Проходил мимо (2007-05-02 14:03) [34]Ошибку "Указанная последовательность сортировки не найдена" возможно получиться исправить, если в config прописать соответствующую кодовою страницу (в данном случае CODEPAGE = 1251).
Но все-таки стоит поправить заголовки таблиц и провести переиндексацию.
А насчет отсутствия кодовой страницы в заголовке - это тоже поправимо...
← →
Сергей М. © (2007-05-02 14:20) [35]
> Проходил мимо (02.05.07 14:03) [34]
> если в config прописать соответствующую кодовою страницу
Для конфиг.строки CODEPAGE=XXX по идее должен существовать ее скриптовый SET-аналог : SET CODEPAGE XXX
Меня бы это полностью устроило, если бы VFP6/7 ее мог исполнить.
Однако, в ответ на SET CODEPAGE XXX я получаю "Команда содержит нераспознанное ключевое слово или фразу"
Вариант с файлом конфигурации на кр.случай и подошел бы, если бы не [26].
Еще раз - я не использую фокс как среду разработки, я пытаюсь использовать только его ран-тайм библиотеку с целью получить корректный и полноценный доступ к фоксовой таблице, заведомо имеющей 866-ю кодировку. И я не собираюсь менять эту кодировку - с этой таблицей работает другое ("чужое") приложение, работающее именно с 866-й кодировкой и ни с какой иной.
← →
sniknik © (2007-05-02 15:01) [36]> Но тогда это как-то не вяжется с твоим утверждением
я работал с фоксовыми таблицами из под фокса же (писал на фоксе), и никогда не пытался "дергать" методы его библиотеки извне.
и советовал именно это
> пользуйся непосредственно фоксом
неважно как ты это понял, имел ввиду я именно это.
> заведомо имеющей 866-ю кодировку
это не фоксовая таблица, либо очень, очень старая. как раз из тех у которых не было байта страницы (и тогда она совпадает с dBase III/III+, дальше пошли расхождения в мемо и индексах. насколько помню), но скорее твоя таблица создана "левым" движком...
потому и проблема, что
> корректный и полноценный доступ
пытаешься получить не к "корректной таблице".
p.s. и на самом деле ты не решаешь проблему, та решаешь проблему на выбранном неверном пути решения... (опять догадки...)
← →
Сергей М. © (2007-05-02 15:31) [37]
> sniknik © (02.05.07 15:01) [36]
> это не фоксовая таблица, либо очень, очень старая
Это именно фоксовая таблица, сделана в FoxPro 2.5
> как раз из тех у которых не было байта страницы
Как раз эта таблица имеет такую инф-цию, и она недвусмысленна - надеюсь, не надо комментировать, что означает байт с кодом 65 (hex) по известному смещению.
> решаешь проблему на выбранном неверном пути решения
Про твои предложения насчет Halcyon"а я уже слышал. Спасибо, это не подходит, я уже сказал тебе почему.
Вариант с VFPOLEDB тоже отпадает, опять же знаешь почему.
Про Jet и разговору нет.
Каков же будет "верный путь решения" ?
> пытаешься получить не к "корректной таблице"
Еще раз повторяю - таблица корректна, фоксовое ядро версии 2.5 с ней успешно работает.
Требуется обеспечить доступ к той же таблице из Win-приложения.
В первую очередь - с целью упаковки и реиндексации (CDX)
← →
Проходил мимо (2007-05-02 15:41) [38]set codepage нет, а описание Вашей ошибки описано в FoxHelp. Там сказано, что ошибка "Указанная последовательность сортировки не найдена" если текщей кодовой страницей не поддерживается указанная последовательность сортировки и, указан единственный способ ее изменить - прописать в config... Поскольку он действительно не использует config, то может следует попробовать пользовать vfpXXrrus.dll? Есть подозрение, что суффикс означает поддержку и кодовой страници, и последовательность сортировки и всего прочего для РФ?..
← →
Сергей М. © (2007-05-02 15:55) [39]
> Проходил мимо (02.05.07 15:41) [38]
> set codepage нет, а описание Вашей ошибки описано в FoxHelp
Да и без хелпа понятно, что параметр CODEPAGE команды SET ядром не распознан.
> может следует попробовать пользовать vfpXXrrus.dll
Вот это уже ближе к телу.
Действительно, ресурсная библ-ка vfp7rrus.dll имеется и находится по одному из дифолтных системных путей поиска.. хотя подозреваю, что судя по русскоязычным сообщениям об ошибках библиотека задействована.
...
← →
Проходил мимо (2007-05-02 15:59) [40]Встречный вопрос возник, насчет версии приложения (FoxPro 2.5) с которым должны работать индексы и таблицы после всех желаемых манипуляций, как то упаковка и реиндексация? Вопрос совместимости...
← →
Сергей М. © (2007-05-02 16:43) [41]После всех этих манипуляций ядро FoxPro 2.5, разумеется, должно нормально работать с таблицей и ее индексным файлом. Вопрос совместимости и меня заботит не менее (если не сказать - в 1-ю очередь), но проверить результаты на предмет совместимости можно лишь проделав эти манипуляции. А говорить о проверке раньше обеспечения нормальной трансляции имеющейся по факту кодовой страницы попросту бессмысленно.
← →
sniknik © (2007-05-02 17:34) [42]> Это именно фоксовая таблица, сделана в FoxPro 2.5
ну наконецто чтото конкретное. досовый фокс разумеется? (не помню виндового 2,5 вроде с 3,0 началося)
с ним работал через ADO, варианты показаны выше (OLDB/ODBC) оба варианта рабочие, у грида указываеш чарсет OEM_CHARSET, при передаче строк в запрос/параметр преобразуешь виндовую строку в OEM.
создание новых индексов не работает переиндексация (PACK TABLE ...) без проблем. (вроде то и надо)
> Про твои предложения насчет Halcyon"а я уже слышал.
100$ жалко? ну так бесплатных аналогов валом (я когда выбирал, отобрал 27 вариантов движков на тестирование, а так их сотни...)
> Вариант с VFPOLEDB тоже отпадает, опять же знаешь почему.
не знаю. почему?
> Про Jet и разговору нет.
опять же, почему? 2,5. это старый формат, jet его худо бедно поддерживает. (раньше так было, а еще раньше был отдельный исам foxpro в jet 3.0, коекто (не я) и его откапывал устанавливал...)
для гарантий попробывать бы надо... ты пробовал?
← →
sniknik © (2007-05-02 17:37) [43]> переиндексация (PACK TABLE ...)
переиндексация и PACK TABLE ...
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.046 c