powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB:Использование DLL написанных на Delphi
14 сообщений из 14, страница 1 из 1
VB:Использование DLL написанных на Delphi
    #34930438
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал пророект на Delphi 7 "Мастер DLL"
Написал код:

library Shortcut;
uses
SysUtils,
ComObj,
ActiveX,
ShlObj,
Registry,
commctrl,
windows,
Classes;

{$R *.res}
function NameFromLink(LinkFileName: string): string;stdcall;
var
MyObject: IUnknown;
MySLink: IShellLink;
MyPFile: IPersistFile;
FileInfo: TWin32FINDDATA;
WidePath: array[0..MAX_PATH] of WideChar;
Buff: array[0..MAX_PATH] of Char;
begin
Result := '';
if (fileexists(Linkfilename) = false) then
exit;
MyObject := CreateComObject(CLSID_ShellLink);
MyPFile := MyObject as IPersistFile;
MySLink := MyObject as IShellLink;
StringToWideChar(LinkFileName, WidePath, SizeOf(WidePath));
MyPFile.Load(WidePath, STGM_READ);
MySLink.GetPath(Buff, Max_PATH, FileInfo, SLGP_UNCPRIORITY);
Result := buff;
end;

exports NameFromLink;

begin
end.

На простом проекте Delphi 7 все работает.
При вот таком вызове,написанной функции:

Private Declare Function NameFromLink Lib "c:\My_DLL.dll" (ByVal F As String) As String
Private Sub Command1_Click()
MsgBox NameFromLink("c:\Ярлык.lnk")
End Sub

Происходит зависание программы, почему?
Пожалуйста,кто может,помогите сделать DLL при помощи которой извлекается путь к запускаемому файлу,так что бы она запускалась из VB.
Заранее спасибо.
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34930532
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если "function NameFromLink(LinkFileName: string): string;stdcall;" написать без "stdcall;",тоесть
"function NameFromLink(LinkFileName: string): string;" программа на VB пишет что неправельные параметры вызова...
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34930598
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.R.O.M.A.R.K,
1) несколько наивно полагать, что у VB и Delphi одинаковые соглашения по передаче строковых параметров. Переделай прототип функции на API-стиль:
function NameFromLink(LinkFileName: PChar; ResultStrBuf: PChar; ResultStrBufLen: DWORD): DWORD; stdcall;
Т.е. функции передавать подготовленный буфер результата и его длину, возвращает она количество скопированных символов. См. также тему.

2) Сдаётся мне, для выполнения этой задачи DLL не нужна вовсе. Сравни:
Код: plaintext
Private Function NameFromLink(LinkFileName As String) As String\n Dim CLSID_ShellLink As UUID\n Dim IID_IUnknown As UUID\n Dim MyObject As stdole.IUnknown\n Dim MyPFile As IPersistFile\n Dim MySLink As IShellLinkA\n Dim FileInfo As WIN32_FIND_DATAA\n Dim Buf As String\n \n CLSIDFromString CLSIDSTR_ShellLink, CLSID_ShellLink\n CLSIDFromString IIDSTR_IUnknown, IID_IUnknown\n CoCreateInstance CLSID_ShellLink, Nothing, CLSCTX_INPROC_SERVER, _\n                  IID_IUnknown, MyObject\n Set MyPFile = MyObject\n Set MySLink = MyObject\n MyPFile.Load LinkFileName, STGM_READ\n Buf = String$(MAX_PATH,  0 )\n MySLink.GetPath Buf, MAX_PATH, FileInfo, SLGP_UNCPRIORITY\n NameFromLink = Left$(Buf, InStr(Buf, vbNullChar) -  1 )\nEnd Function
10 отличий есть? Для того, чтобы эта функция откомпилировалась, нужна вот эта библиотека типов .
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34930806
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктP.R.O.M.A.R.K,
Переделай прототип функции на API-стиль:
function NameFromLink(LinkFileName: PChar; ResultStrBuf: PChar; ResultStrBufLen: DWORD): DWORD; stdcall;
Т.е. функции передавать подготовленный буфер результата и его длину, возвращает она количество скопированных символов.
Я тут пытаюсь это сделать,у меня ничего не получается...
Пожалуйста,кинь 2 простых исходника на VB и Delphi,
В DLL на Delphi будет функция GetMyText.
Если из VB ее вызвать так: GetMyText(5,sString),то в переменной sString будет текст "aaaaa"
Если ее вызвать так: GetMyText(10,sString),то в переменной sString будет текст "aaaaaааааа"
Ты мне очень поможешь,если сделаешь их,я уже несколько дней пытаюсь сделать функцию для работы с текстом и ничерта не получается...
Заранее спасибо.
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34931023
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.R.O.M.A.R.K
Давненько я не брал в руки "шашки".
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 Library  LibGetMyText;

 Uses  SysUtils,
     Windows;

 {$R *.RES} 
 Function  GetMyText(BufLen: DWORD; Buf: PChar): DWORD; stdcall;
  Var  i: DWORD;
 Begin 
  If  BufLen >  0   Then   Begin 
    BufLen := BufLen -  1 ;
     If  BufLen >  0   Then 
        For  i :=  0   To  BufLen -  1   Do 
          Buf[i] := 'a';
    Buf[BufLen] := # 0 
  End ;
 GetMyText := BufLen;
 End ;

 Exports  GetMyText;

 Begin 
 End .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Explicit

Private Declare Function GetMyText _
   Lib "C:\Projects\Delphi\LibGetMyText\LibGetMyText.dll" ( _
   ByVal BufLen As Long, ByVal Buf As String) As Long

Private Sub Command1_Click()
 Dim BufLen As Long
 Dim Buf As String
 BufLen =  5 
 Buf = String$(BufLen, vbNullChar)
 Debug.Print GetMyText(BufLen +  1 , Buf)
 MsgBox Buf
End Sub
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34931121
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БенедиктP.R.O.M.A.R.K
Давненько я не брал в руки "шашки".

Бенедикт,большое спасибо,ты мне очень помог.
Я реньше что-то похожее писал,но Delphi ругался на синтаксис и разные неправельные написания...
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34931124
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт
2) Сдаётся мне, для выполнения этой задачи DLL не нужна вовсе. Сравни:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Function NameFromLink(LinkFileName As String) As String
 Dim CLSID_ShellLink As UUID
 Dim IID_IUnknown As UUID
 Dim MyObject As stdole.IUnknown
 Dim MyPFile As IPersistFile
 Dim MySLink As IShellLinkA
 Dim FileInfo As WIN32_FIND_DATAA
 Dim Buf As String
 
 CLSIDFromString CLSIDSTR_ShellLink, CLSID_ShellLink
 CLSIDFromString IIDSTR_IUnknown, IID_IUnknown
 CoCreateInstance CLSID_ShellLink, Nothing, CLSCTX_INPROC_SERVER, _
                  IID_IUnknown, MyObject
 Set MyPFile = MyObject
 Set MySLink = MyObject
 MyPFile.Load LinkFileName, STGM_READ
 Buf = String$(MAX_PATH,  0 )
 MySLink.GetPath Buf, MAX_PATH, FileInfo, SLGP_UNCPRIORITY
 NameFromLink = Left$(Buf, InStr(Buf, vbNullChar) -  1 )
End Function

Скачал библиотеку типов,все работает,большое спасибо,очень помог.
Долго искал,ничего найти не мог.
Скажи ты с Delphi на VB сам перевел ?
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34931209
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт
Для того, чтобы эта функция откомпилировалась, нужна вот эта библиотека типов.
Я скачал эту библиотеку,разархивировал.
Открыл VB>Свойства проекта>Выбрал olelib.tlb
Все работало.
Скопировал папку с olelib.tlb в папку своего проекта.
Открыл VB>Свойства проекта>Выбрал olelib.tlb
olelib.tlb не активируется из новой папки,только из старой
Бенедикт,помоги,в чем дело
я перепробовал все...
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34931565
Фотография Бенедикт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.R.O.M.A.R.KСкажи ты с Delphi на VB сам перевел ?Сам. Это механический процесс, размышлений почти не требует .

По библиотеке типов: значит, не всё попробовал. Можно поправить вручную в реестре, можно взять утилиту отсюда .
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #34941473
Фотография P.R.O.M.A.R.K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бенедикт P.R.O.M.A.R.KСкажи ты с Delphi на VB сам перевел ?Сам. Это механический процесс, размышлений почти не требует .

По библиотеке типов: значит, не всё попробовал. Можно поправить вручную в реестре, можно взять утилиту отсюда .
Спасибо за утилитку,все работает...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
VB:Использование DLL написанных на Delphi
    #35789444
wildrain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DLL Delphi 6

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 Library  ksuaw;

 uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
 {$R *.RES} 
 procedure  EmulateKeys(Wnd: Integer; VKey: Integer); stdcall;
 asm 
  push  0 
  push edx
  push 0100H
  push eax
  call PostMessage
 end ;

 Exports  EmulateKeys;

 Begin 
 End .

Вызов этой DLL из того же Delphi

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 unit  Unit2;

 interface 

 uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

 type 
  TForm1 =  class (TForm)
    Button1: TButton;
    Edit1: TEdit;
     procedure  Button1Click(Sender: TObject);
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end ;

 var 
  Form1: TForm1;

 implementation 
  procedure  EmulateKeys (Wnd: Integer; VKey: Integer); external 'ksuaw.dll';

 {$R *.dfm} 

 procedure  TForm1.Button1Click(Sender: TObject);
 var 
h: integer;
 begin 
h := FindWindow ( nil , 'Безымянный - Блокнот');
EmulateKeys (h,  112 )  //Нажымаем клавишу F1 
 end ;

 end .

Вот VB 6

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Private Declare Sub EmulateKeys Lib "C:\Works\VB\DllAd\ksuaw.dll" (ByVal Wnd As Long, ByVal VKey As Long)
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
    X As Long
    Y As Long
    End Type

Private Sub Command1_Click()
i =  5 
Command1.Caption = "Select Window 1 (5)"
Dim nPoint As POINTAPI

For forCommand5_Click =  1  To  5 
    Command1.Caption = "Select Window (" & forCommand5_Click & "-5)"
    Sleep ( 1000 )
Next forCommand5_Click

GetCursorPos nPoint
ggg = WindowFromPoint(nPoint.X, nPoint.Y)
Command1.Caption = ggg
End Sub

Private Sub Command2_Click()
EmulateKeys ggg,  112 
Command2.Caption = "Send F1"
End Sub

В VB ничего не происходит. К томуже нельзя зарегить Regsvr32.exe /u ksuaw.dll пишет про невозможность найти точку входа.
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #35801076
wildrain
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема была в передаче параметров с VB в DLL.
Большое спасибо всем за помощь в решении этой проблемы, со своей стороны я поступлю также.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
VB:Использование DLL написанных на Delphi
    #36643974
xwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wildrainПроблема была в передаче параметров с VB в DLL.

В чем там подвох? Я уже вторые сутки над этим бъюсь.
...
Рейтинг: 0 / 0
VB:Использование DLL написанных на Delphi
    #36646763
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: xwind
> В чем там подвох? Я уже вторые сутки над этим бъюсь.

Подвох в объявлении экспортируемой функции как stdcall

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB:Использование DLL написанных на Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]