Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 Заголовок сообщения: |
|
|
Текст длл в студию. А еще лучше откомпилированную прогу (для подтверждения факта ошибки) с исходниками (для поиска ошибки).
Скорее всего в мапинфо меняется путь по умолчанию, и программа не может ее найти. Надо отлаживать. Советую обратить внимание на моменты, в которых, возможно, происходит смена папок (открытие, создание таблиц и подобное) |
|
Вернуться к началу |
|
 |
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 Заголовок сообщения: |
|
|
вот что не так?!  |
|
Вернуться к началу |
|
 |
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
И со скобками и без скобок работает, но проблема этим не решается  |
|
Вернуться к началу |
|
 |
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, поспробуем разобраться в чем проблема. |
|
Вернуться к началу |
|
 |
Nick4
Зарегистрирован: 15.10.2011 Сообщения: 95
|
Добавлено: Пт Июл 14, 2017 2:17 pm Заголовок сообщения: |
|
|
У меня была такая же ситуация, только dll был написан на С++. Оказалось компилятор по умолчанию собирает dll не полностью. При установленном на компьютере компиляторе, dll работает. Если компилятора нет, не хватает библиотек. Выход - перекомпилировать dll с настройками, которые включают в библиотеку полный код. Где в delphi не знаю. Ищите в гугл. |
|
Вернуться к началу |
|
 |
|