Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Error loading "midas.dll"


Автор: Нитонисе 16.1.2010, 13:46
Такая ошибка возникает при переносе программы на другой компьютер. Я думаю, что это связано с используемым компоненом ClientDataSet, потому что эта ошибка возникает тогда, когда он задействуется. Если же на компьютере, где возникает это ошибка, в системную папку Windows\system32 добавить эту библиотеку midas.dll вручную, то больше эта ошибка не выскакивает.
Вопрос - нужно всгда эту библиотеку вручную передавать на компьютер, где будет сипользоваться программа с ClientDataSet, либо компилятор как-то решает эту проблему? И вообще это системный файл или какой-то постовляемый со средой разработки?

Автор: artsb 16.1.2010, 13:53
Можно создать инсталлятор и при установке устанавливать библиотеку. ИМХО библиотека не системная, иначе, она бы там была smile

Автор: smoke_man 16.1.2010, 13:55
Один из http://forum.sources.ru/index.php?showtopic=262302&hl= 

Автор: artsb 16.1.2010, 13:56
О происхождении dll:
http://www.processlibrary.com/directory/files/midas/
Цитата

Author     Borland Software Corporation

Автор: Лена 16.1.2010, 13:57
Это файл не системный и поставляется со средой разработки. При переносе программы вы можете просто прилагать этот файл в папку с программой или сюда: Windows\system32 или просто Windows\

midas.dll используется не для ClientDataSet, а для распределенного доступа в технологии DataSnap - старое название Midas.

Автор: Нитонисе 16.1.2010, 14:38
Цитата(Лена @  16.1.2010,  13:57 Найти цитируемый пост)
При переносе программы вы можете просто прилагать этот файл в папку с программой или сюда: Windows\system32 или просто Windows\

Это не очень удобно. Нельзя по другому решать вопрос без создания инсталлятора? Ведь компилятор подключает в exe все нужные ресурся для автономной работы, а вот с этой библиотекой что-то у него не сростается.

Автор: mrbrooks 16.1.2010, 15:11
Нитонисе, ее надо зарегистрировать через regsvr32

Добавлено через 54 секунды
smoke_man, упс. уже было  smile 

Автор: Нитонисе 16.1.2010, 15:19
Цитата(mrbrooks @  16.1.2010,  15:11 Найти цитируемый пост)
Нитонисе, ее надо зарегистрировать через regsvr32

Я что-то не понял методику этой регистрации.

Автор: mrbrooks 16.1.2010, 15:51
Цитата(Нитонисе @  16.1.2010,  15:19 Найти цитируемый пост)
Я что-то не понял методику этой регистрации.

из командной строки вызываешь regsvr32 путь\midas.dll

Автор: Нитонисе 16.1.2010, 15:55
Цитата(mrbrooks @  16.1.2010,  15:51 Найти цитируемый пост)
из командной строки вызываешь regsvr32 путь\midas.dll

Опять не понял. Мне нужно перенести приложение на другой компьютер. Там, очевидно, этой библиотеки нет. Переносить вместе с приложением и библиотеку - неудобно. Я бы хотел чтобы либо компилятор как-то включил все необходимое в исполняемый файл, либо как-то особо зарегистрировал эту самую библиотеку (ну что-то типа #include "midas.dll" по сути).

Автор: mrbrooks 16.1.2010, 15:59
Цитата(Нитонисе @  16.1.2010,  15:55 Найти цитируемый пост)
Опять не понял. Мне нужно перенести приложение на другой компьютер.

для этого используй готовый инсталлятор. или пиши свой (не айс)

Автор: Нитонисе 16.1.2010, 16:06
Цитата(mrbrooks @  16.1.2010,  15:59 Найти цитируемый пост)
для этого используй готовый инсталлятор. или пиши свой

А, ну это понятно. Только я хотел обойтись без инсталяторов. Никак?

Автор: artsb 16.1.2010, 17:41
Нитонисе, если не ищешь лёгких путей: http://www.rsdn.ru/article/baseserv/peloader.xml
Там как раз то, что тебе нужно  smile 

Автор: Нитонисе 16.1.2010, 17:52
Цитата(artsb @  16.1.2010,  17:41 Найти цитируемый пост)
Нитонисе, если не ищешь лёгких путей: Загрузчик PE-файловТам как раз то, что тебе нужно 

Спасибо. Ознакомлюсь  smile 

Автор: XYLIGAN 17.1.2010, 18:32
Подключи:
Код

#include <dbxdsnmys.h> 

А потом на создание основной формы повесь:
Код

void __fastcall TMainForm::FormCreate(TObject *Sender)
{
  RegisterMidasLib(::DllGetDataSnapClassObject);
}

На С++ Buider 6 у меня работает

Автор: hater 3.11.2010, 12:48
Цитата(XYLIGAN @ 17.1.2010,  18:32)
Подключи:
Код

#include <dbxdsnmys.h> 

А потом на создание основной формы повесь:
Код

void __fastcall TMainForm::FormCreate(TObject *Sender)
{
  RegisterMidasLib(::DllGetDataSnapClassObject);
}

На С++ Buider 6 у меня работает

Скажите, как такое же сделать для builder c++ 2010? Очень надо, помогите, пожалуйста.

Автор: hater 3.11.2010, 17:33
нашел следующее

===========================================
How to statically link dbExpress drivers
------------------------------
Static linking of dbExpress drivers (dbxdsnint.lib for
InterBase, dbxdsnora.lib for Oracle, dbxdsndb2.lib for DB2,
or dbxdsnmys.lib for MySQL 3.23.x) in C++Builder is a two-
step process: Link the driver, then register both the driver
and the DataSnap library. You can enter this code in your
TForm constructor.
The .lib files are located in your \cbuilder6\lib directory.

Important:
Do not link more than one dbExpress driver into a project.
Linking more than one driver will cause linking errors and
may require a corrective shutdown of C++Builder.

The following example uses the InterBase driver.

Step 1. Include the dbExpress/DataSnap header file:

#include <dbxdsnint.h>

Step 2. Register the static library:

RegisterDbXpressLib(::getSQLDriverINTERBASE);
RegisterMidasLib(::DllGetClassObject);

Note:
DataSnap (a part of what was formerly known as MIDAS) is
linked in to each dbExpress driver for C++Builder 6. Thus,
if you need to statically link DataSnap only for access to
midaslib, simply link in any of the drivers listed above.
============================================

Подскажите, пожалуйста, как подобное осуществить в builder c++ 2010...

Автор: hater 3.11.2010, 17:59
еще нашел вот что:
Database applications that use client datasets such as TClientDataSet or dataset providers require you to include midas.dcu (for Delphi) or midas.hpp (for C++) (for static linking when providing a standalone executable)

то есть, как я понял, нужно сделать нечто подобное:
#include <midas.hpp>

внес изменения, проект перекомпилировал, все равно midas.dll не хочет в экзешник :(

Автор: hater 3.11.2010, 21:17
Никто не сталкивался с этим?..

Автор: oldcode 4.11.2010, 00:06
Цитата(hater @ 3.11.2010,  21:17)
Никто не сталкивался с этим?..

Имхо, Вы говорите о разных вещах.
#include <midas.hpp> подключает к проекту соотвествующий заголовочный файл, но не добавляет dll, типа как jpg'a в Image (хотя и тут не все так однозначно smile ).
Чтобы реализовать задуманное Вами, следовало бы эту midas.dll запихнуть в ресурс, который добавить в ехе, во время выполнения midas.dll извлечь, зарегистрировать , использовать, потом удалить... ИМХО, проще просто положить в папку рядом с ехе и зарегистрировать (regsvr32 путь\midas.dll), говорят, временами проходит и без регистрации.
Проблема при весе midas.dll (Вин7) 445 кб. явно надумана.
Цитата(hater @ 3.11.2010,  17:33)
нашел следующее
===========================================
How to statically link dbExpress drivers
------------------------------
============================================
Подскажите, пожалуйста, как подобное осуществить в builder c++ 2010...

вот как там говорят, так для 2010 и делайте, не получится, спрашивайте с обоснованием вопроса smile

Автор: hater 4.11.2010, 13:21
спасибо, что откликнулись.

вот тут рассматривалась подобная задача:
http://www.rsdn.ru/forum/delphi/3779048.flat.aspx

а именно:
"Нужна Ваша помощь — создал программу на C++Builder6, использующую механику dbexpress для
работы с БД, при этом имеется насущная необходимость не таскать никаких dll поддержки dbexpress вместе с исполняемым модулем ... как это проделать под Delphi в сети рекомендация присутствует очень плотно — там необходимо добавить в оператор USES ссылку на три DCU файла и они перечисляются — Crtl, MidasLib и dbExpXXX (этот зависит от конкретной СУБД) .. Как это проделать для C++ Builder ?"

только в моем случае это будет C++Builder 2010.

частично проблему решил: убрал галку с build with runtime packages и поставил dynamic RTL в false, но появилась проблема в лице midas.dll.
не подскажите, как ее статически прилинковать к экзешнику(не уверен что правильно выразился), то есть чтобы не носить ее вместе с исполняемым файлом и не регистрировать в реестре?

может быть кто-то сталкивался... просто по указанной ссылке рассматривается случай с builder6 с++, а на тот момент, как я понимаю, статической библиотеки midas еще не поставлялось и поэтому склонен полагать, что данная проблема решается для builderc++ 2010 несколько иначе.

p.s. извиняюсь за сумбурное изложение мысли.

Автор: hater 4.11.2010, 13:55
если пойти по пути, указанному в той ссылке, то следует выполнить следующее:

Step 1. Include the dbExpress/DataSnap header file:
#include <dbxdsnint.h>

Step 2. Register the static library:
RegisterDbXpressLib(::getSQLDriverINTERBASE);
RegisterMidasLib(::DllGetClassObject);

итого:

The correct code to include in the main form constructor is therefore;
#include <sqlexpr.hpp>//for RegisterDbXpressLib()
#include <dbxdsnint.h>//or <dbxdsnmys.h>for MySQL
RegisterDbXpressLib(::getSQLDriverINTERBASE);
// or RegisterDbXpressLib(::getSQLDriverMYSQL); for MySQL
RegisterMidasLib(::DllGetDataSnapClassObject);

в случае с builder c++ 2010:
- Unable to open include file 'dbxdsnint.h'
- нет функции RegisterDbXpressLib
- так же нет DllGetDataSnapClassObject поскольку не получается открыть 'dbxdsnint.h'

подскажите, как проделать подобное для builder c++ 2010

Автор: oldcode 4.11.2010, 15:10
Unable to open include file 'dbxdsnint.h' - для начала разберитесь с путями и переменными окружения,
посмотрите здесь http://www.softholm.com/articles/midas.html
и здесь http://www.google.com/search?q=%D0%B5%D0%BB%D0%BC%D0%B0%D0%BD%D0%BE%D0%B2%D0%B0+midas&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:uk:official&client=firefox-a

Добавлено через 1 минуту и 18 секунд
на крайняк, если у вас есть dbxdsnint.h, бросьте в папку с проетом и добавьте в проект

Автор: hater 4.11.2010, 15:40
спасибо Вам большое, за то что не оставляете меня в трудной ситуации.
сейчас всё попробую, что Вы указали.

скажите, я двигаюсь в правильном направлении?

Автор: oldcode 4.11.2010, 17:25
Цитата(hater @ 4.11.2010,  15:40)
в правильном направлении?

если что-то делаете, значит, таки да smile

Автор: hater 4.11.2010, 18:17
а Вы знаете решение этого вопроса? =)

Автор: oldcode 5.11.2010, 02:44
иногда стоит забыть все, о чем говорилось выше, и посмотреть на вопрос по-новому smile
а возвращаясь к истокам... может, дело не в физическом размещении библиотеки ?

Автор: hater 5.11.2010, 13:36
проблема в том, что эта библиотека любит себя в реестре прописывать при первом использовании на компьютере...
а если у пользователя антивирусник будет блокировать попытки записи в реестр...
поэтому надо эту библиотеку прилинковать статически и получить автономный исполняемый файл.
как это сделать для builder c++ 2010 для меня до сих пор остается загадкой...

Автор: Лена 5.11.2010, 16:33
Я тоже исследовала этот вопрос...
midas.dll до версии C++ Builder XE, насколько мне известно, включить чтобы все работало нормально, в файл exe не удастся. Это можно сделать только в Дельфи. В С++ Builder XE эта проблема решена. До этой версии - C++ Builder XE, чтобы все работало достаточно просто поместить midas.dll в папку system32. Если все же существует возможность включить midas.dll в файл exe до версии C++ Builder XE, то гуру меня поправят, мне это не удалось.

Автор: hater 5.11.2010, 16:48
мм... простите меня за неосведомленность, builder xe вышел после builder 2010 ?..

Добавлено через 9 минут и 28 секунд
Цитата(Лена @ 5.11.2010,  16:33)
Я тоже исследовала этот вопрос...
midas.dll до версии C++ Builder XE, насколько мне известно, включить чтобы все работало нормально, в файл exe не удастся. Это можно сделать только в Дельфи. В С++ Builder XE эта проблема решена. До этой версии - C++ Builder XE, чтобы все работало достаточно просто поместить midas.dll в папку system32. Если все же существует возможность включить midas.dll в файл exe до версии C++ Builder XE, то гуру меня поправят, мне это не удалось.

эх...
p.s. очень бы хотелось услышать мнение гуру на этот счет =)

Автор: Лена 5.11.2010, 17:10
Цитата(hater @  5.11.2010,  16:48 Найти цитируемый пост)
мм... простите меня за неосведомленность, builder xe вышел после builder 2010 ?..


Да. http://www.embarcadero.com/products/cbuilder
http://www.embarcadero.com/rad-studio-xe-preview (видео на русском).


Автор: hater 5.11.2010, 17:50
ладно, Бог с этим 2010 builder'ом...

Вы не могли бы подсказать, как решить данную проблему в builder xe ?.. =)

Автор: hater 6.11.2010, 18:06
Лена, ответьте, пожалуйста...

Автор: hater 6.11.2010, 23:57
отвечаю сам)
поставил builder c++ xe
проблема вроде бы решена, вроде бы - потому что тестил пока только на компе соседа
спасибо большое всем откликнувшимся

Автор: hater 8.11.2010, 09:26
отдельная благодарность Лене
спасибо Лена smile

Автор: Нитонисе 16.3.2013, 17:08
Не удается победить эту проблему. Использую C++ Builder XE, компонент TClientDataSet. Помещаю midas.dll в системную папку system32 - нет эффекта. Регистрирую командой regsrv32 - нет эффекта. Хотя при втором способе сообщение вроде какое-то неправильное... как будто сама библиотека не найдена, хотя точно находится там где нужно.

http://www.radikal.ru

Автор: Нитонисе 17.3.2013, 09:55
Разобрался. Команда regsvr32 не срабатывала потому что операционная система 64-битная и в этом случае доступа к папке system32 у команды нет. Перенес библиотеку в папку system и она успешно зарегеистрировалась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)