С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
1

Использование функций из других .dll

10.08.2012, 22:15. Показов 5107. Ответов 42
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый вечер.
Ребята такая просьба у меня есть дллка написанная на дельфи. Как мне ее подключить и использовать оттуда функции? На дельфи это выглядит так;
описание и подключение
Delphi
1
function MyFunk_Pass(FileName: WideString; var Publisher: WideString): LONG; stdcall; external 'Parser.dll';
использование:
Delphi
1
2
3
proba: LONG;
Publisher: WideString;
proba := MyFunk_Pass(Edit1.Text, Publisher);
как мне можно ее подключить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2012, 22:15
Ответы с готовыми решениями:

Использование функций из DLL
Всем привет! В С++ я новичек, долго пытался разобраться, но, видимо, без помощи никак. Иммется...

Задача на использование функций в качестве параметров других функций
Составить программу по заданному условию. Первая часть условия является заданием на разработку...

Использование dll F# в других ЯП
Очень вдохновлен F#, написал пару библиотек. Пожалуй, другие ЯП, врятли, осилят такую быструю...

Использование dll в других языках
Добрый вечер. Ситуация такая, у меня есть dll(библиотека классов) написанная на C#. Смогу ли я...

42
LK
Заблокирован
11.08.2012, 00:33 2
Dynamic-Link Library: Теория + Практика
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 17:25  [ТС] 3
написал как все понял, но что то не работает, даже не выводит, что функция найдена, как будто зависает
C++
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  typedef long __cdecl (*dll_func)(WideString FileName, WideString Publisher);
 
  dll_func pShowSum = NULL;
 
  HMODULE hDLL = LoadLibraryA("Parser.dll");
 
  if (!hDLL) {
     ShowMessage("Невозможно загрузить TestDLL.dll");
  //return;
 
     pShowSum = (dll_func)GetProcAddress(hDLL, "_MyFunk_Pass"); // обратите название на название функции (объяснение будет ниже)
 
     if (!pShowSum) {
         ShowMessage("Невозможно найти функцию ShowSum");
     //return;
     }
     else ShowMessage("можно найти функцию ShowSum");
 
     WideString Publisher;
     long VerifiedStatus;
     VerifiedStatus = pShowSum("C:\\Windows\\RtlExUpd.dll",Publisher);
     //Label1->Caption =  pShowSum("C:\\Windows\\RtlExUpd.dll",Publisher);
     if(VerifiedStatus == 0){
        
        Label1->Caption =  Publisher;
     }
     else
  Label1->Caption ="файл не подписан";
 
FreeLibrary(hDLL);
}
 
}
В чем ошибка.
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,880
Записей в блоге: 1
12.08.2012, 17:49 4
фигурные скобки посчитайте
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.08.2012, 18:11 5
Можно попробывать сделать lib файл чтоб динамически не подгружать.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 21:30  [ТС] 6
Цитата Сообщение от kzru_hunter Посмотреть сообщение
фигурные скобки посчитайте
посчитал, все вроде норм. Ошибку не вижу. ошибку нашел. теперь не находит функцию???


Цитата Сообщение от Avazart Посмотреть сообщение
Можно попробывать сделать lib файл чтоб динамически не подгружать.
а это как можно сделать, если дллка не моя?
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.08.2012, 21:59 7
Поытаться можно implib
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 22:47  [ТС] 8
Цитата Сообщение от Avazart Посмотреть сообщение
Поытаться можно implib
делаю так
implib mydll.dll VerifyTrust.lib
пишет нет implib
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.08.2012, 23:04 9
https://www.cyberforum.ru/blog... og478.html

Добавлено через 15 минут
Там у меня в блогах должно быть где то...
implib.exe - должен быть где файлах Builder-а, это консольная утилита
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 23:05  [ТС] 10
Ребята все скомпилировал, все так то норм, есть одна проблема при выполнение этой функции результат выводит другой чем в дельфи вместо "0" выводит 1631552 при чем постоянно?
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.08.2012, 23:07 11
Выложи либу(dll и h-файлы) и тестовый пример, будет время посмотрю
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.08.2012, 01:49  [ТС] 12
вот код на дельфи
Delphi
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, Buttons, StdCtrls, XPMan;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    XPManifest1: TXPManifest;
    procedure BitBtn1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
type
  LONG = Longint;
 
function SD_GetVerifiedPublisher(FileName: WideString; var Publisher: WideString): LONG; stdcall; external 'VerifyTrust.dll';
 
function GetCompanyName(FileName: WideString): WideString;
var
  Handle, Len, Size: Cardinal;
  Translation: WideString;
  Data: PWideChar;
  Buffer: Pointer;
begin
  try
    Size := GetFileVersionInfoSizeW(PWideChar(FileName), Handle);
    if Size > 0 then
    begin
      GetMem(Data, Size);
      try
        if GetFileVersionInfoW(PWideChar(FileName), Handle, Size, Data) then
        begin
          if VerQueryValueW(Data, '\VarFileInfo\Translation', Buffer, Len) then
          begin
            Translation := IntToHex(PDWORD(Buffer)^, 8);
            Translation := Copy(Translation, 5, 4) + Copy(Translation, 1, 4);
          end;
          if VerQueryValueW(Data, PWideChar('\StringFileInfo\' + Translation + '\CompanyName'), Buffer, Len) then
            Result := PWideChar(Buffer);
        end;
      finally
        FreeMem(Data);
      end;
    end;
  except
  end;
end;
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    Edit1.Text := OpenDialog1.FileName;
    Button1.Click;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Publisher: WideString;
  VerifiedStatus: LONG;
begin
  VerifiedStatus := SD_GetVerifiedPublisher(Edit1.Text, Publisher);
  MessageBeep(0);
  // Только в случае возврата 0 подпись считается действительной
  if VerifiedStatus = 0 then
  begin
    // Файл подписан, подпись действительна
    MessageBoxA(0, PAnsiChar('Издатель: ' + AnsiString(Publisher) +
      #13#10 + #13#10 + 'Цифровая подпись действительна'), 'Результат проверки', 0);
  end
  else
  begin
    if Publisher = '' then
    begin
      // Файл не подписан, пробуем получить имя компании из FileVersionInfo
      Publisher := GetCompanyName(Edit1.Text);
      if Publisher <> '' then
        MessageBoxA(0, PAnsiChar('Издатель: ' + AnsiString(Publisher) +
          #13#10 + #13#10 + 'Цифровая подпись отсутствует'), 'Результат проверки', 0)
      else
        MessageBoxA(0, PAnsiChar('Издатель: ' + 'Неизвестен' +
          #13#10 + #13#10 + 'Цифровая подпись отсутствует'), 'Результат проверки', 0)
    end
    else
    begin
      // Файл подписан, но подпись не действительна
      MessageBoxA(0, PAnsiChar('Издатель: ' + AnsiString(Publisher) +
        #13#10 + #13#10 + 'Цифровая подпись не действительна'), 'Результат проверки', 0);
    end;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text := Application.ExeName;
end;
 
end.
вот я его переписал на С++
C++
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
36
37
38
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   typedef long __cdecl (*dll_func)(WideString FileName, WideString Publisher);
 
   dll_func pShowSum = NULL;
 
   HMODULE hDLL = LoadLibraryA("VerifyTrust.dll");
 
   if (!hDLL) {
     ShowMessage("Невозможно загрузить TestDLL.dll");
     return;
   }
// здесь не нужно было подчеркивание вот и выдавало ошибку
   pShowSum = (dll_func)GetProcAddress(hDLL, "SD_GetVerifiedPublisher"); // обратите название на название функции (объяснение будет ниже)
 
   if (!pShowSum) {
      ShowMessage("Невозможно найти функцию ShowSum");
      return;
   }
   else ShowMessage("можно найти функцию ShowSum");
 
    WideString Publisher;
    long VerifiedStatus;
    VerifiedStatus = pShowSum("C:\\Windows\\HotfixChecker",Publisher);
     //Label1->Caption =  pShowSum("C:\\Windows\\RtlExUpd.dll",Publisher);
    if(VerifiedStatus == 0){
        // Файл подписан, подпись действительна
        /*  MessageBoxA(0, "Издатель: " + AnsiString(Publisher) +
        "Цифровая подпись действительна", "Результат проверки", 0); */
       Label1->Caption =  Publisher;
    }
    else{
        Label1->Caption ="файл не подписан";
        Label2->Caption =  VerifiedStatus;
        Label3->Caption =  Publisher;
    }
   FreeLibrary(hDLL);
}
длл во вложение
Вложения
Тип файла: rar VerifyTrust.rar (607.2 Кб, 17 просмотров)
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 04:25 13
Вы проверяли код на делфи?

Пробывал просмотреть dll -ку но пишит что она поврежденная...

C:\Windows\system32>tdump C:\Users\fujitsu\Desktop\Win32\VerifyTrust.dll
Turbo Dump Version 6.1.0.0 Copyright (c) 1988-2008 CodeGear
Display of File c:\users\fujitsu\desktop\win32\verifytrust.dll
ERROR: Invalid signature for an .EXE file - found 0DF0, expected 5A4D
Или Dependency Walker

Error: At least one file was not a 32-bit or 64-bit Windows module.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.08.2012, 19:03  [ТС] 14
Цитата Сообщение от Avazart Посмотреть сообщение
Вы проверяли код на делфи?
Пробывал просмотреть dll -ку но пишит что она поврежденная...
Код который я вам дал да я его компилировал, ошибок не было, единственное, что беспокоит это то, что он в основном выдает всегда цифровую подпись, а другой код на С++ визуал который у меня есть то он не на всех выдает, что есть цифровая подпись.
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 19:05 15
Все понял... это я напортачил вчера с dll

Сейчас посморю сного ... ( ночью уже не соображал нормально )
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 20:09 16
Написал на Builder 2009. но не знаю устраивает ли ваш результат...

C++
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
36
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "VerifyTrust.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
#pragma comment(lib,"VerifyTrust-bcb.lib")
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    WideString Publisher;
    long VerifiedStatus;
    VerifiedStatus = SD_GetVerifiedPublisher("C:\\Windows\\HotfixChecker",Publisher);
 
    if(VerifiedStatus == 0)
      {
       Label1->Caption =  Publisher;
      }
    else
      {
       Label1->Caption ="файл не подписан";
       Label2->Caption =  VerifiedStatus;
       Label3->Caption =  Publisher;
      }
}
//---------------------------------------------------------------------------
Миниатюры
Использование функций из других .dll  
Вложения
Тип файла: rar Test VerifyTrust.rar (554.0 Кб, 8 просмотров)
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 20:40 17
При использовании нужно подключать к проекту VerifyTrust.h и VerifyTrust-bcb.lib

Добавлено через 28 минут
Просмотрел код еще раз ваш код на Delphi и повидимому стоит внести изменения ...

VerifyTrust.h
C++
1
2
3
4
5
6
#ifndef VerifyTrustH
#define VerifyTrustH
//--------------------------
extern "C" long __declspec(dllimport) __stdcall SD_GetVerifiedPublisher(WideString,WideString);
//--------------------------
#endif // VerifyTrustH
И подключать VerifyTrust.lib вместо VerifyTrust-bcb.lib
C++
1
#pragma comment(lib,"VerifyTrust.lib")
Все из-за соглашеня __stdcall это кстати может влиять на результат

http://www.rsdn.ru/article/devtools/bcbdll.xml
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
15.08.2012, 20:32  [ТС] 18
Спасибо, работает отлично, только одна проблема он почти на все файлы показывает, что есть цифровая подпись.
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.08.2012, 20:34 19
Ну а оригинал ?
Т.е. откуда увереность что сама dll работает правильно?
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
16.08.2012, 07:08  [ТС] 20
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е. откуда увереность что сама dll работает правильно?
уверенности тю-тю.
0
16.08.2012, 07:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2012, 07:08
Помогаю со студенческими работами здесь

Использование переменных из других функций
Как использовать переменные из одной функции в другой для записи и чтения?

Использование функций DLL из другой DLL
Ребята подскажите имеется hscli.DLL hscli.LIB и hscli.H , собираю свою DLL-ку , которая...

Использование функций и констант из других файлов
Использование функций и констант из других notebook-ов. Например у меня множества констант и...

Использование функций DLL, написанной на C++
В проекте C# нужно использовать функции, написанные на с++. Создал DLL-ку, все отлично цепляется....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru