powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Делфийская DLL и основная программа C++, передача агрументов туда-сюда
3 сообщений из 3, страница 1 из 1
Делфийская DLL и основная программа C++, передача агрументов туда-сюда
    #38458359
MrGalaxy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

DLL:
Код: sql
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.
library M3_78M;

var N: integer;

{$R *.res}

function GetValue(PM:pointer; out PN:pointer): boolean; stdcall; Export;
 var M: integer;
     MM: ^integer;
Begin
 GetValue:=false;

 MM:=PM;
 M:=MM^;
 N:=M+1;
 PN:=@N;

 GetValue:=true;
end;

{----------------------------------------------------------------------}

Exports GetValue;

begin
end.



Осн. прога:
Код: sql
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.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
 hM3_dll = LoadLibrary("M3_78M.dll");
 GetValue =(TGetValue)GetProcAddress(hM3_dll,"GetValue");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int  Mumber,    // Входной параметр
  *AMumber,   // Указатель (адрес) входного параметра
   Number,    // Выходной параметр
  *ANumber,   // Указатель (адрес) выходного параметра
	**AANumber;  // Указатель (адрес) указателя (адреса) вых. параметра

// Присвоение значения входному параметру
 Mumber=StrToInt(Edit2->Text);
// В качестве входного параметра подпрограммы
//  используются указатель (адрес)
 AMumber=&Mumber;

// В качестве выходного параметра подпрограммы
//  используются указатель указателя
// (адрес адреса)
 AANumber=&ANumber;

 GetValue(AMumber, AANumber);    // Вызов подпрограммы

// Извлечение значения выходного параметра по указателю
 Number=*ANumber;
 Edit1->Text=IntToStr(Number);

 Application->ProcessMessages();
}

//---------------------------------------------------------------------------


Заголовок:
Код: sql
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.
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TButton *Button1;
	TEdit *Edit1;
	TEdit *Edit2;
	void __fastcall Button1Click(TObject *Sender);
	void __fastcall FormActivate(TObject *Sender);
private:	// User declarations
public:  // User declarations
	__fastcall TForm1(TComponent* Owner);
};
//====================================================================//
 typedef bool (WINAPI *TGetValue)(int*, int**);  // ** !
 TGetValue GetValue;
 HINSTANCE hM3_dll;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif



Проект простой. На форме одна кнопка и два поля TEdit. По нажатии на кнопку происходит увеличение содержимого Edit2 на единицу и результат заносится в Edit1.

Почему в C++ входной параметр воспринимается как ссылка, а выходной - как ссылка ссылки ?
При этом, если основная прога написана на Делфи, то всё ожидаемо: и входной, и выходной параметры воспринимаются как ссылки на числа.

Извращался по всякому. И cdecl ставил, и var вместо out. Один фиг...

Это так задумано, или я где-то накосячил? Полдня лопатил всемирную помойку, ничего не нашёл.
Подскажите, плз., если кто сталкивался.
...
Рейтинг: 0 / 0
Делфийская DLL и основная программа C++, передача агрументов туда-сюда
    #38458567
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrGalaxy...Это так задумано, или я где-то накосячил? Полдня лопатил всемирную помойку, ничего не нашёл.
Подскажите, плз., если кто сталкивался.

"я тебе одын умный вещь скажу, ты только не обижайся! Твой машин в соседнем дворе стоит." (из кинухи).

По теме:
Обычно, если с ходу, после умных книжек не получается, то делают следующее.
1) берётся программка типа хэллохты мир, и необходимый тип параметра который необходимо передать туда или сюда.
2) компиляеца всё вместе, как задумано.
3) запускается обычный отладчик, и на нижнем уровне смотрите как и что передаётся-читается.
4) правите исходный код, повторяете с пункта 2
5) когда всё заработает - вставляете в боевой код.

язык пофигу, компилятор пофигу, комбинации связи - пофигу.
приходилось вязать так разные языки...
фортраны, асемблеры, кларионы, клипперами, ваткомы, на различных осях - различный софт, всякие резиденты-прерывания на борландах доводить до ума, править лаги в сишных библиотеках и т.п. и т.д.. короче говоря метода даст вам однозначный результат - надёжность и понятие как это должно быть...

удачи вам
(круглый)
...
Рейтинг: 0 / 0
Делфийская DLL и основная программа C++, передача агрументов туда-сюда
    #38458666
MrGalaxy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Зачем нам мелкоскоп, у нас и так глаз пристрелямши! (с) (За точность цитаты из Лескова не ручаюсь, но как-то так :) ).

Видимо придётся осваивать какой-н. отладчик.
Ну да ладно, путём шаманских плясок вприсядку с бубном и балалайкой , а также благодаря подсказкам с Киберфорума, пришёл к такому коду dll:

Код: pascal
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.
library M3_78M;

uses Windows;

{$R *.res}

function GetValue(PM:Pointer; out N:Integer): BOOL; stdcall;
 var M: Integer;
     MM: PInteger;
Begin
 GetValue:=false;

 MM:=PM;
 M:=MM^;
 N:=M+1;

 GetValue:=true;
end;

{----------------------------------------------------------------------}

Exports GetValue;

begin
end.



Как оказалось, делфийские out и var добавляют лишнюю ссылку, поэтому такая чехарда и творилась. В С++ теперь достаточно одной звёздочки, а делфийский вызов оформил так:

Код: pascal
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.
unit Unit1;

interface

uses
  SysUtils, Forms, StdCtrls, Classes, Controls, Windows;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;

    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

function GetValue(MM, NN: Pointer):BOOL; stdcall;external 'M3_78M.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
 var PN: PInteger;
     PM: Pointer;
     M, N: integer;
Begin
// Присвоение значения входному параметру
// В качестве входного параметра подпрограммы
//  используются указатель (адрес)
 M:=StrToInt(Edit2.Text);
 PM:=@M;
// В качестве выходного параметра подпрограммы
//  так же, как и входного, используются указатель (адрес),
// несмотря на то, что в DLL-ке выходной параметр out Integer
 PN:=@N;
// Вызов подпрограммы
 GetValue(PM, PN);
// Полученный результат. По адресу переменной N, занесённому перед этим
// в переменную-указатель PN, заносится вычисленное в подпрограмме
// значение
 Edit1.Text:=IntToStr(N);
 Application.ProcessMessages;
end;

end.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Делфийская DLL и основная программа C++, передача агрументов туда-сюда
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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