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

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

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

Студворк — интернет-сервис помощи студентам
Всем добрый вечер.
Ребята такая просьба у меня есть дллка написанная на дельфи. Как мне ее подключить и использовать оттуда функции? На дельфи это выглядит так;
описание и подключение
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.08.2012, 22:15
Ответы с готовыми решениями:

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

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

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

42
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
11.08.2012, 00:33
Dynamic-Link Library: Теория + Практика
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 17:25  [ТС]
написал как все понял, но что то не работает, даже не выводит, что функция найдена, как будто зависает
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
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
12.08.2012, 17:49
фигурные скобки посчитайте
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.08.2012, 18:11
Можно попробывать сделать lib файл чтоб динамически не подгружать.
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 21:30  [ТС]
Цитата Сообщение от kzru_hunter Посмотреть сообщение
фигурные скобки посчитайте
посчитал, все вроде норм. Ошибку не вижу. ошибку нашел. теперь не находит функцию???


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

Добавлено через 15 минут
Там у меня в блогах должно быть где то...
implib.exe - должен быть где файлах Builder-а, это консольная утилита
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
12.08.2012, 23:05  [ТС]
Ребята все скомпилировал, все так то норм, есть одна проблема при выполнение этой функции результат выводит другой чем в дельфи вместо "0" выводит 1631552 при чем постоянно?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.08.2012, 23:07
Выложи либу(dll и h-файлы) и тестовый пример, будет время посмотрю
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
13.08.2012, 01:49  [ТС]
вот код на дельфи
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
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 04:25
Вы проверяли код на делфи?

Пробывал просмотреть 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\verifytru st.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  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вы проверяли код на делфи?
Пробывал просмотреть dll -ку но пишит что она поврежденная...
Код который я вам дал да я его компилировал, ошибок не было, единственное, что беспокоит это то, что он в основном выдает всегда цифровую подпись, а другой код на С++ визуал который у меня есть то он не на всех выдает, что есть цифровая подпись.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 19:05
Все понял... это я напортачил вчера с dll

Сейчас посморю сного ... ( ночью уже не соображал нормально )
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 20:09
Написал на 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
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.08.2012, 20:40
При использовании нужно подключать к проекту 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  [ТС]
Спасибо, работает отлично, только одна проблема он почти на все файлы показывает, что есть цифровая подпись.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.08.2012, 20:34
Ну а оригинал ?
Т.е. откуда увереность что сама dll работает правильно?
0
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
16.08.2012, 07:08  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е. откуда увереность что сама dll работает правильно?
уверенности тю-тю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2012, 07:08
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru