[ОТВЕТИТЬ]
04.03.2012 13:26
Janek
 
как в Delphi 6 использовать DLL, созданный в Visual Basic

Добавлено через 19 минут 46 секунд
Если использую метод статической вставки DLL-файла:
implementation

{$R *.dfm}
procedure set_CommodityCharSize(B:WideString); far external 'ScLoad.dll';

procedure TfmExample.bbRunClick(Sender: TObject);
var B:integer;
Handle:LongWord;
begin
B := 12;
set_CommodityCharSize(IntToStr(B));
end;

то тогда при запуске клавишой F9 возникает сообщение
"The module ScLoad.dll was loaded but the
entry-point DllRegisterServer was not found.

Make sure that "scload.dll" is a valid DLL or OCX file
and then try again."

Добавлено через 3 минуты 13 секунд
"the application was unable to start correctly (0xc000007b). Click OK to close
the application."

Вот это сообщение выходит при запуске клавишей F9
04.03.2012 13:30
AlexeyF
 
Какая разница где создана dll
В дельфи есть стандартный способ объявить dll в программе. Единственный нюанс способ передачи параметров - на сколько помню их два. Если известны процедуры/функции, передаваемые параметры и их типы - открой хелп - там всё есть.
04.03.2012 13:35
Janek
 
Да, эти процедуры и параметры процедур известны, но почему-то при попытке использования этих процедур в проекте Дельфи6 возникает сообщение
"the application was unable to start correctly (0xc000007b). Click OK to close
the application."
04.03.2012 13:59
AlexeyF
 
{ импорт по специфицированному имени }

procedure ImportByName;external 'MYDLL' name 'MYEXPORTPROC';

{ импорт по оригинальному имени }

procedure MyExportFunc1; external 'MYDLL';

Попробуй по другому объявить.

Добавлено через 17 минут 14 секунд
Сделай поиск строчки "delphi dll 0xc000007b" в гугле
Много интересного вылезает - основная мысль всётаки неправильная передача параметров.
04.03.2012 14:23
Janek
 
Попробовал объявить эту процедуру по-другому:
procedure set_CommodityCharSize2(B:WideString); external 'ScLoad.dll' name 'set_CommodityCharSize'; ,

но все равно при запуске клавишей F9 возникает сообщение:

"the application was unable to start correctly (0xc000007b). Click OK to close
the application."

Добавлено через 1 минуту 14 секунд
Да, я искал в гугле по теме этой ошибки, но ничего конкретного не нашел. Ни у кого не было этой проблемы.
04.03.2012 14:25
OlegON
 
исходник васика есть? еще в Delphi есть дампер dll, как я помню, вот им надо посмотреть exports-секцию в dll, сдается мне, что это сервер COM, а не просто подключаемая библиотечка. в общем, я склоняюсь к мысли, что вызов неправильный.
04.03.2012 14:57
Janek
 
я же передаю этой процедуре тип данных WideString.
Что здесь неправильного в конкретной передаче параметра?

Добавлено через 7 минут 9 секунд
Исоходник есть, но как я его Вам пришлю, если здесь нельзя ссылку показывать?
Здесь есть какой-то tlb-файл, но я не знаю, как его использовать в совокупности с dll-файлом.

Добавлено через 3 минуты 20 секунд
tdump.exe я запустил и в его результатах export секция была нулевая

Добавлено через 2 минуты 41 секунду
Интересно, что этот dll-файл не удается зарегистрировать в регистрах Windows 7 с помощью команды
regsvr32 scload.dll
04.03.2012 15:34
Janek
 
Что такое Васик?
05.03.2012 08:16
student
 
Цитата:
Janek то тогда при запуске клавишой F9 возникает сообщение
"The module ScLoad.dll was loaded but the
entry-point DllRegisterServer was not found.

Make sure that "scload.dll" is a valid DLL or OCX file
and then try again."
обычно это говорит о том, что ты пытаешься регистрировать элемент, который в принципе не может быть зарегистрирован- объявляй ф-ции длл-ки у себя внутри в проекте как обычные виндовые апи (извини синтаксис дельфей уже не помню - слишком давно было) и посмотри в инете соответствие типов переменных в этих средах

кстати,

Цитата:
Janek Исоходник есть, но как я его Вам пришлю, если здесь нельзя ссылку показывать?
Здесь есть какой-то tlb-файл, но я не знаю, как его использовать в совокупности с dll-файлом.
смысл тогда какой юзать эту длл-ку - портируй все к себе сразу (в васике все трогательно просто :))- меньше накладных расходов у тебя будет
05.03.2012 13:03
Janek
 
как корректно импортировать в Дельфи 6 компоненты ActiveX, созданные в Visual Basic?
Через Project - Import Type Library пробовал, но потом в проекте Дельфи кричит, что использую незарегистрированный класс.
05.03.2012 13:16
student
 
Цитата:
Janek как корректно импортировать в Дельфи 6 компоненты ActiveX, созданные в Visual Basic?
Через Project - Import Type Library пробовал, но потом в проекте Дельфи кричит, что использую незарегистрированный класс.
я писал что если не регается - это скорее всего не активикс и не импортировать, а портировать - код на бейсике адаптировать под дельфи и избавится от длл-ки
05.03.2012 13:25
Janek
 
Когда пытаюсь использовать класс, содержащийся в библиотеке, то выскакивает такое сообщение:
"Project project1.exe raised exception class EOleSysError with message "Class not registered". Process stopped. Use Step or Run to continue."
05.03.2012 13:35
student
 
Цитата:
Janek Когда пытаюсь использовать класс, содержащийся в библиотеке
Цитата:
student код на бейсике адаптировать под дельфи и избавится от длл-ки
есть исходники (было написано выше) пробежать по ними и перевести код бейсика в код дельфи и избавится от библиотеки - задача примитивная

к сожалению, но мне больше нечего добавить :(
05.03.2012 13:40
Janek
 
как перевести код бейсика под код Дельфи? Я этим бейсиком никогда не пользовался.
05.03.2012 13:52
student
 
Цитата:
Janek как перевести код бейсика под код Дельфи? Я этим бейсиком никогда не пользовался.
там элементарные операции такие же как в дельфи, если занимались программированием - все должно получиться - те же самые переменные, циклы, классы - ничего нового для вас там не будет :)
любой код можно разобрать при желании, а уж бейсик - это просто прелесть для таких операций - не знаю как сейчас а раньше его даже в школах преподавали...
открываете файл проекта с расширением bas или cls блокнотиком и вперед
05.03.2012 14:05
Janek
 
Вот код Бейсика:
Imports ScLoad
Imports System.Text
Imports System.IO
Imports System

Public Class frmMain
Private WithEvents plu As New PLU
Private ScaleCodepage As String

Private Sub cmdSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSend.Click
Application.DoEvents()
plu.SendPLU()
End Sub

Private Sub plu_ErrorMessageScales(ByVal result As String) Handles plu.ErrorMessageScales
If Not result = String.Empty Then MessageBox.Show(result)
End Sub

Private Sub plu_PluHexFile(ByVal message As String) Handles plu.PluHexFile
Me.RichTextBox1.Text = message
Me.RichTextBox1.Refresh()
End Sub

Private Sub plu_SendingMessage(ByVal message As String) Handles plu.SendingMessage
ToolStripStatusLabel1.Text = message
StatusStrip1.Refresh()
End Sub

Private Sub frmMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'txtScales.Text = "192.168.2.21;windows-1257 192.168.2.22;ibm775 192.168.2.23;windows-1257 "
Me.txtScales.Text = "192.168.32.87"
Me.txtComName.Text = "Jahutatud broilerifilee (pakendatud gaasikeskkonda)"
Me.chkWeighed.Checked = True
Me.txtLabel1FR.Text = "12"
Me.txtUsedByDate.Text = "2"
Me.chkPackedDatePrint.Checked = True
Me.chkCommUcase.Checked = True
BindComboCodepages()
'Codepages
'Baltic (ISO), iso-8859-4, iso-8859-4
'Baltic (Windows), windows-1257, windows-1257
'775: Baltic (DOS), ibm775, ibm775
'850: Western(European(DOS), ibm850, ibm850)
End Sub

Private Sub BindComboCodepages()

'cmbCharacterSize.Items.AddRange(FontSize)
'cmbCharacterSize.ValueMember.Insert(0, "00")
'cmbCharacterSize.ValueMember.Insert(1, "01")
Dim cmbArray As New ArrayList
cmbArray.Add(New ValueDescriptionPair("ibm775", "Baltic (DOS) 775"))
cmbArray.Add(New ValueDescriptionPair("ibm850", "Western European (DOS) 850"))
cmbArray.Add(New ValueDescriptionPair("ibm852", "Central European (DOS) 852"))
cmbArray.Add(New ValueDescriptionPair("windows-1250", "Central European (Windows) 1250"))
cmbArray.Add(New ValueDescriptionPair("windows-1251", "Cyrillic (Windows) 1251"))
cmbArray.Add(New ValueDescriptionPair("Windows-1252", "Western European (Windows) 1252"))
cmbArray.Add(New ValueDescriptionPair("windows-1257", "Baltic (Windows) 1257"))
'cmbArray.Add(New ValueDescriptionPair("utf-8", "Unicode (UTF-8)"))
'cmbArray.Add(New ValueDescriptionPair("utf-32", "Unicode (UTF-32)"))

With cmbScaleCodepage

.DisplayMember = "Description"
.ValueMember = "Value"
.DataSource = cmbArray '.DataSource = dsData.Tables("CharacterSize")
End With
cmbScaleCodepage.SelectedIndex = 0
Dim bFound As Boolean
Dim ItemCount As Integer
Dim SelVal As Short
Dim strFormatValue As Short
Dim cbItemCount As Integer

ItemCount = -1
cbItemCount = cmbScaleCodepage.Items.Count

While Not bFound Or ItemCount <= cbItemCount - 1
If strFormatValue = SelVal Then
Exit While
bFound = True
End If
ItemCount += 1
If ItemCount >= cbItemCount Then
cmbScaleCodepage.SelectedIndex = cbItemCount - 1
Exit While
End If
cmbScaleCodepage.SelectedIndex = ItemCount
End While

End Sub

Private Sub cmbScaleCodepage_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbScaleCodepage.SelectedIndexChanged
ScaleCodepage = CType(cmbScaleCodepage.SelectedItem, ValueDescriptionPair).Value
Me.ToolStripStatusLabel1.Text = ScaleCodepage
End Sub

Private Sub cmdCreateFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCreateFile.Click

plu.set_ScalesIP(txtScales.Text.Trim)
plu.set_ScalesCodepage(ScaleCodepage)

If Me.chkCommUcase.Checked Then
plu.set_CommodityUCASE(True)
Else
plu.set_CommodityUCASE(False)

End If
If Not Me.txtCommodityFontSize.Text = String.Empty Then plu.set_CommodityCharSize(Me.txtCommodityFontSize.Text)
If Not Me.txtCommodityMaxRowLen.Text = String.Empty Then plu.set_CommodityRowMaxLen(CShort(Me.txtCommodityMaxRowLen.Text))

plu.CreatePlu(True, Me.txtPlu.Text, Me.txtItemCode.Text, Me.txtUnitPrice.Text, _
Me.chkWeighed.Checked, Me.txtLabel1FR.Text, Nothing, Me.txtComName.Text, Me.txtPluTare.Text, _
Me.txtUsedByDate.Text, Me.chkPackedDatePrint.Checked)

End Sub

Private Sub cmdAppend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdAppend.Click

plu.set_ScalesIP(txtScales.Text.Trim)
plu.set_ScalesCodepage(ScaleCodepage)

If Me.chkCommUcase.Checked Then
plu.set_CommodityUCASE(True)
Else
plu.set_CommodityUCASE(False)

End If
If Not Me.txtCommodityFontSize.Text = String.Empty Then plu.set_CommodityCharSize(Me.txtCommodityFontSize.Text)
If Not Me.txtCommodityMaxRowLen.Text = String.Empty Then plu.set_CommodityRowMaxLen(CShort(Me.txtCommodityMaxRowLen.Text))

plu.CreatePlu(False, Me.txtPlu.Text, Me.txtItemCode.Text, Me.txtUnitPrice.Text, _
Me.chkWeighed.Checked, Me.txtLabel1FR.Text, Nothing, Me.txtComName.Text, Me.txtPluTare.Text, _
Me.txtUsedByDate.Text, Me.chkPackedDatePrint.Checked)

End Sub

Private Sub txtScales_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtScales.TextChanged

End Sub

Private Sub txtUnitPrice_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtUnitPrice.TextChanged

End Sub

Private Sub txtPluTare_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPluTare.TextChanged

End Sub

Private Sub Label6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label6.Click

End Sub

Private Sub txtPlu_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPlu.TextChanged

End Sub

Private Sub txtItemCode_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtItemCode.TextChanged

End Sub

Private Sub txtUsedByDate_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtUsedByDate.TextChanged

End Sub

Private Sub chkPackedDatePrint_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkPackedDatePrint.CheckedChanged

End Sub

Private Sub chkWeighed_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkWeighed.CheckedChanged

End Sub

Private Sub txtLabel1FR_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtLabel1FR.TextChanged

End Sub

Private Sub txtComName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtComName.TextChanged

End Sub

Private Sub chkCommUcase_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkCommUcase.CheckedChanged

End Sub

Private Sub txtCommodityMaxRowLen_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtCommodityMaxRowLen.TextChanged

End Sub

Private Sub txtCommodityFontSize_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtCommodityFontSize.TextChanged

End Sub

Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged

End Sub
End Class

Public Class ValueDescriptionPair

Public Value As Object
Public Description As String

Public Sub New(ByVal NewValue As Object, ByVal NewDescription As String)
Value = NewValue
Description = NewDescription
End Sub

Public Overrides Function ToString() As String
Return Description
End Function


End Class

Добавлено через 2 минуты 45 секунд
этот код бейсика ведь тоже импортирует dll-файл

Добавлено через 8 минут 33 секунды
это не bas-файл. Это vb-файл.
05.03.2012 14:05
student
 
Цитата:
Janek Вот код Бейсика:
Imports ScLoad
Imports System.Text
Imports System.IO
Imports System

Public Class frmMain
Private WithEvents plu As New PLU
а где класс PLU?

если портировать к себе он тоже нужен будет - основное походу в нем - т.к. есть plu.SendPLU() - отсылка плушки - то что вы привели - обслуга этого - установка параметров и т.п.

если исходников под Plu нет - то вероятнее всего вы пытаетесь юзать не ту длл-ку у себя в проекте
05.03.2012 14:11
Janek
 
класс PLU описан в файле ScLoad.tbl

Добавлено через 57 секунд
imports ScLoad - это наверно и есть ссылка на файл, содержащий этот класс PLU
05.03.2012 14:45
Janek
 
когда Визуал Бейсик обращается к ScLoad.dll, то у него не возникает конфликта с классами и функциями, содержащимися в этом ScLoad.dll
05.03.2012 14:46
student
 
Цитата:
Janek класс PLU описан в файле ScLoad.tbl

Добавлено через 57 секунд
imports ScLoad - это наверно и есть ссылка на файл, содержащий этот класс PLU
тогда исходников судя по всему нет :)
а то что есть - это от демки, которая идет с библиотекой

попробуй описать ф-ции у себя в проекте и поднять библиотеку через winapi LoadLibrary и только уж потом юзать ф-ции библиотеки
05.03.2012 15:12
Janek
 
исходник есть, но не могу к нему подключиться в Дельфи. Кажется, что нет связи с этим исходником. Возникает ошибка "Project project1.exe raised exception class EOleSysError with message "Class not registered" . Process stopped. Use Step or Run to continue. "
Надо как-то по-другому загружать этот dll, потому что в нем есть activeX компоненты.
05.03.2012 15:31
student
 
Цитата:
Janek исходник есть,
тогда портируй его к себе

Цитата:
Janek Надо как-то по-другому загружать этот dll, потому что в нем есть activeX компоненты.
если так - то юзай
Цитата:
student попробуй описать ф-ции у себя в проекте и поднять библиотеку через winapi LoadLibrary и только уж потом юзать ф-ции библиотеки
сначала загружай в память (LoadLibrary) а уж потом юзай через объявленные у себя в проекте ф-ции

другого не дано если работает в проекте бейсика - будет работать практически везде
05.03.2012 15:44
Janek
 
не знаешь, в Дельфи нет какой-то ошибки при загрузке сторонних ActiveX компонентов? По-моему у меня компоненты загрузились, но функции и классы не прикрепились.
При использовании Loadlibrary и потом обращении к функции этой библиотеки возникает ошибка
"the application was unable to start correctly (0xc000007b). Click OK to close
the application."
05.03.2012 16:00
student
 
Цитата:
Janek не знаешь, в Дельфи нет какой-то ошибки при загрузке сторонних ActiveX компонентов? По-моему у меня компоненты загрузились, но функции и классы не прикрепились.
При использовании Loadlibrary и потом обращении к функции этой библиотеки возникает ошибка
"the application was unable to start correctly (0xc000007b). Click OK to close
the application."
я уже более 8-и лет к дельфям не прикасался, если только код какой от туда глянуть :)
05.03.2012 16:54
Janek
 
какие проекты ты писал на Дельфи 8 лет назад и почему ты оставил Дельфи?
Если я скину тебе файлы, которые надо подключить к Дельфи, можешь попробовать на своей машине?
05.03.2012 18:09
student
 
Цитата:
Janek какие проекты ты писал на Дельфи 8 лет назад и почему ты оставил Дельфи?
Если я скину тебе файлы, которые надо подключить к Дельфи, можешь попробовать на своей машине?
проекты - разные - в основном для обучения студентов (до 99 годы) потом ушел - т.к. сменились приоритеты (базы\бухгалтерия\товароучет\... - проще делать на специализированных инструментах - но это вопрос вкуса - холивар устраивать не собираюсь) - изредка правил написанное, потом стало совсем не актуально
попробовать у себя не смогу - за неимением сейчас дельфей и желания их вспоминать :) (лучше уж тогда ни сишник все переписать, только не плюсовый и не шарп, классический - msc 6.0 который)
могу попробовать на vb\vbа - но тебе это скорее всего не интересно - если все таки интересно - цепляй все в хранилище форума и давай ссылку - попробую глянуть
06.03.2012 14:20
Janek
 


Вот ссылк на файл scload.dll.
Пожалуйста посмотри, как корректно обратиться к процедуре createplu() с параметрами.
Буду очень признателен.

Добавлено через 1 минуту 10 секунд
То есть ты не захотел заниматься тем, что стало модно в начале 2000-х - бухгалтерские и торговые программы?

OlegON:
Прошу не отклоняться от темы
06.03.2012 14:55
student
 
Цитата:
Janek Пожалуйста посмотри, как корректно обратиться к процедуре createplu() с параметрами.
одной длл-ки не достаточно, раз она не регитстрится, нужно еще и описание что там внутри (как задекларированы ф-ции, сколько у них параметров и какие) - ты писал про исходники, значит у тебя все есть - и как описать и как обратиться - а сейчас получается - есть черный ящик у которого есть что-то внутри и ты просишь с этим чем-то что-то сделать :) дизассемблированием не занимаюсь со времен ухода с доса

м.б. проще будет если напишешь какие весы пытаешся грузить - на форуме есть различные решения
или если проект на vb работает, то использовать непосредственно его, а дельфями только готовить данные
06.03.2012 15:02
Janek
 
Эта длл-ка открывается в Visual Basic. Tools - Object Browser и открываешь эту длл.
Весы SM-500.
Мне дали задание написать именно на Дельфях этот проект.

Добавлено через 1 минуту 52 секунды
Мне дали задание использовать именно эту scload.dll и используя Дельфи.

Добавлено через 33 секунды
Мне дали задание использовать именно эту scload.dll и используя Дельфи.
06.03.2012 15:12
student
 
Цитата:
Janek Эта длл-ка открывается в Visual Basic. Tools - Object Browser и открываешь эту длл.
ты не поверишь, но я первым делом именно так и поступил, как скачал (только не в vb а в vba, что в принципе одна фанера)
либо я чего то в этой жизни не понимаю, либо чего то не хватает :)


Опции темы


Часовой пояс GMT +3, время: 11:33.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.