www.map-info.ru :: Просмотр темы - Проблема с dll !!!!!!!!!!!!!!!!!!!!
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  

 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
X-Ray



Зарегистрирован: 04.12.2009
Сообщения: 38
Откуда: Казань

СообщениеДобавлено: Вт Дек 22, 2009 1:27 pm    Заголовок сообщения: Проблема с dll !!!!!!!!!!!!!!!!!!!! Добавить ответ со ссылкой на данный текст

При запуске mbx, в которой используется dll, написанная на делфи, на моем компе всё без проблем на других компах появляется ошибка

"Не найдена библиотека.. Не удалось присоединить внешнюю библиотеку.... "

dllка не регистрируется ни на одном из компов
Com-объекты не создаются

Что делать?! В чем проблема? Подскажите, пожалуйста!!!



***************************************************
Include "MENU.DEF"
Include "MAPBASIC.DEF"


Declare Function GetFocus Lib "User32"() as Integer
Declare Function Borders Lib "MyDLL.dll" As String
Declare Function Table_elements Lib "MyDLL.dll" As String
Declare Function Table_of_elements2 Lib "MyDLL.dll" As String



Declare Function OpenTables Lib "MyDLL.dll"(ByVal OpenTabNames As String) As Logical
Declare Sub CreateTheForm1 Lib "MyDLL.dll"(ByVal Handle As Integer)
Declare Sub CreateTheForm2 Lib "MyDLL.dll"(ByVal Handle As Integer)
Declare Sub CreateTheForm3 Lib "MyDLL.dll"(ByVal Handle As Integer)
Declare Sub ShowTheForm1 Lib "MyDLL.dll"
Declare Sub DestroyTheForms Lib "MyDLL.dll"


Declare Sub Main()
Declare sub MsgCreate
Declare sub Exit


Global Handle As Integer
Global OpenTabList, SelTabNames As String


Sub Main

Handle = GetFocus()
Create Menu "&Утилиты" As
"&Отчёты\tCtrl+W/W^W" Calling MsgCreate ,
"(-",
"&Выход\tCtrl+E/W^E" Calling Exit

Alter Menu Bar Add "Утилиты"

End Sub


Sub MsgCreate

Dim i As Integer
Dim Cmd As String
Dim OpenTabNames As String


Set ProgressBars Off


If NumTables()=0 Then
Note "Ни одна таблица не открыта"
Call DestroyTheForms
Else
For i= 1 to NumTables()
If TableInfo(i,TAB_INFO_MAPPABLE) Then
OpenTabNames = OpenTabNames + TableInfo(i,TAB_INFO_NAME) + " "
End If
Next
Call CreateTheForm1(Handle) ' вот здесь ругается
Call CreateTheForm2(Handle)
Call CreateTheForm3(Handle)
If OpenTables(OpenTabNames)=False Then
Note "Ни одна таблица не открыта"
Call DestroyTheForms
Else
Call ShowTheForm1
End If


End If

End sub

SUB Exit
End Program
END SUB
***************************************************
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alex_Y



Зарегистрирован: 28.11.2008
Сообщения: 122

СообщениеДобавлено: Вт Дек 22, 2009 1:40 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Текст длл в студию. А еще лучше откомпилированную прогу (для подтверждения факта ошибки) с исходниками (для поиска ошибки).

Скорее всего в мапинфо меняется путь по умолчанию, и программа не может ее найти. Надо отлаживать. Советую обратить внимание на моменты, в которых, возможно, происходит смена папок (открытие, создание таблиц и подобное)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Вт Дек 22, 2009 2:32 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

а где лежит при этом dll? в папке с mbx?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
X-Ray



Зарегистрирован: 04.12.2009
Сообщения: 38
Откуда: Казань

СообщениеДобавлено: Вт Дек 22, 2009 3:47 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

dll лежит в той же папке

********************************
library MyDLL;


uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
Inifiles,
OLEAuto,
Excel97,
Report in 'Report.pas' {Form1},
Report2 in 'Report2.pas' {Form2},
Report3 in 'Report3.pas' {Form3};
{$R *.res}
var
My_Path:String ;
OpenTabList :TStringList;

procedure DestroyTheForms; stdcall;
Begin
Form1.Free;
Form2.Free;
Form3.Free;
End;

procedure CreateTheForm1(hWnd: THandle); stdcall;
var
i : integer;
Begin
Application.Handle := hWnd;
Form1 := TForm1.Create(Application);
For i:=1 To IniFile.ReadInteger('ReportName', 'ReportCounts', 0) Do Form1.ComboBox1.Items.Add(IniFile.ReadString('ReportName', 'Report'+IntToStr(i), ''));
End;

procedure CreateTheForm2(hWnd: THandle); stdcall;
Begin
Application.Handle := hWnd;
Form2:= TForm2.Create(Application);
Form2.CheckBox1.Caption:=IniFile.ReadString('Group By', 'Groupfields1', '');
Form2.CheckBox2.Caption:=IniFile.ReadString('Group By', 'Groupfields2', '');
Form2.CheckBox3.Caption:=IniFile.ReadString('Group By', 'Groupfields3', '');
Form2.CheckBox4.Caption:=IniFile.ReadString('Group By', 'Groupfields4', '');
Form2.CheckBox5.Caption:=IniFile.ReadString('Group By', 'Groupfields5', '');
Form2.CheckBox6.Caption:=IniFile.ReadString('Group By', 'Groupfields6', '');
Form2.CheckBox7.Caption:=IniFile.ReadString('Group By', 'Groupfields7', '');
Form2.CheckBox8.Caption:=IniFile.ReadString('Group By', 'Groupfields8', '');
Form2.CheckBox9.Caption:=IniFile.ReadString('Group By', 'Groupfields9', '');
End;

procedure CreateTheForm3(hWnd: THandle); stdcall;
Begin
Application.Handle := hWnd;
Form3 := TForm3.Create(Application);
End;

procedure ShowTheForm1; stdcall;
Begin

ShowMessage('ShowTheForm1');
if (Form1<>nil) then Form1.Show;
End;

Function ShowDllPath: String ; stdcall;
var
TheFileName : array[0..MAX_PATH] of char;
begin
Result:='';
FillChar(TheFileName, sizeof(TheFileName), #0);
GetModuleFileName(hInstance, TheFileName, sizeof(TheFileName));
ShowDllPath:= ExtractFileDir(TheFileName);
end;


Exports
CreateTheForm1,
CreateTheForm2,
CreateTheForm3,
ShowTheForm1,
DestroyTheForms ;


begin
My_Path:=ShowDllPath();
If FileExists(My_Path+'\Соответствие.ini') then IniFile := TIniFile.Create( My_Path+'\Соответствие.ini')
Else
Begin
MessageDlg ('Ошибка доступа к файлу '+My_Path+'\Соответствие.ini', mtError, [mbOk], 0);
Exit;
End;
end.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
X-Ray



Зарегистрирован: 04.12.2009
Сообщения: 38
Откуда: Казань

СообщениеДобавлено: Вт Дек 22, 2009 3:49 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

вот что не так?! Crying or Very sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
FedorinoFF



Зарегистрирован: 01.02.2007
Сообщения: 272
Откуда: Санкт-Петербург

СообщениеДобавлено: Вт Дек 22, 2009 11:13 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

мне казалось что в сообщении об ошибке пишется имя dll, которая не смогла подгрузиться?
и после "user32" круглые скобки может не надо?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
X-Ray



Зарегистрирован: 04.12.2009
Сообщения: 38
Откуда: Казань

СообщениеДобавлено: Вт Дек 22, 2009 11:57 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Вы правы, в сообщении пишется имя dll, в данном случае MyDLL.dll
И со скобками и без скобок работает, но проблема этим не решается Crying or Very sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Alex_Y



Зарегистрирован: 28.11.2008
Сообщения: 122

СообщениеДобавлено: Ср Дек 23, 2009 5:11 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

X-Ray
Зачем вам функция GetFocus? В МИ есть своя, которая прекрасно с этим справляется SystemInfo(SYS_INFO_MAPINFOWND) или SystemInfo(SYS_INFO_MDICLIENTWND)

У вас проблема где-то в коде делфи. Просто возврат ошибки из делфи происходит в эту фукцию, поэтому мапинфо выдает такую ошибку. Возможно, неправильная работа с памятью. Так, например, я не нашел у вас, когда вы освобождаете указатель ини-файла? Скорее всего есть еще подобные моменты. Почему и сказал выше, нужны исходные тексты, чтобы можно было отладить. И отлаживать надо именно из делфи.

Можете прислать мне исходники и готовую программу, которая выдает ошибку, на мыло ayabrov@yandex.ru, поспробуем разобраться в чем проблема.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Nick4



Зарегистрирован: 15.10.2011
Сообщения: 95

СообщениеДобавлено: Пт Июл 14, 2017 2:17 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

У меня была такая же ситуация, только dll был написан на С++. Оказалось компилятор по умолчанию собирает dll не полностью. При установленном на компьютере компиляторе, dll работает. Если компилятора нет, не хватает библиотек. Выход - перекомпилировать dll с настройками, которые включают в библиотеку полный код. Где в delphi не знаю. Ищите в гугл.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru