Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Перевод кода Delphi

24.04.2015, 15:27. Показов 4658. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!!

Ребята помогите, пожалуйста, с переводом кода с Delphi на С++ Builder. Хоть на форуме уже не 1 год, просто никогда не приходилось переводить с делфи, а в основном старался избегать этого и решить другим способом, но это другой случай. Прошу сильно не пинать, но критику выслушаю!!! Вот код, который я частично переделал, но в других участках кода я не совсем понимаю, куда что вставлять.

Есть 2 юнита. 1 юнит (Unit1.cpp) я создал автоматом при создании проекта в котором есть форма, а на форме Memo и 2 второй юнит (NLMEvents.cpp), который, необходимо соедеинить с Unit1.cpp и заносить данные в Memo.


Код на Delphi
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
unit NLMEvents;
 
interface
 
function StartNLMEventListener: HResult;
function StopNLMEventListener: HResult;
 
implementation
 
uses
  Windows, ActiveX, NETWORKLIST_TLB, SysUtils, Unit1;
 
type
  TMyNetworkEvents = class(TInterfacedObject, INetworkEvents, INetworkConnectionEvents, INetworkListManagerEvents)
  public
    function NetworkAdded(networkId: TGUID): HResult; stdcall;
    function NetworkConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
    function NetworkDeleted(networkId: TGUID): HResult; stdcall;
    function NetworkPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
    function ConnectivityChanged(NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
    function NetworkConnectionConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
    function NetworkConnectionPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
  end;
 
var
  pNLM: INetworkListManager = nil;
  dwCookie1: LongInt = -1;
  dwCookie2: LongInt = -1;
  dwCookie3: LongInt = -1;
 
const
  IID_IConnectionPointContainer: TGUID = '{B196B284-BAB4-101A-B69C-00AA00341D07}';
  //IID_IUnknown: TGUID = '{00000000-0000-0000-C000-000000000046}';
  //CLSID_NetworkListManager: TGUID = '{DCB00C01-570F-4A9B-8D69-199FDBA5723B}';
 
function TMyNetworkEvents.ConnectivityChanged(NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('ConnectivityChanged');
  Result := S_OK;
end;
 
function TMyNetworkEvents.NetworkConnectionConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('NetworkConnectionConnectivityChanged');
  Result := S_OK;
end;
 
function TMyNetworkEvents.NetworkConnectionPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('NetworkConnectionPropertyChange');
  Result := S_OK;
end;
 
function TMyNetworkEvents.NetworkAdded(networkId: TGUID): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('NetworkAdded');
  Result := S_OK;
end;
 
function TMyNetworkEvents.NetworkConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('NetworkConnectivityChanged');
  Result := S_OK;
end;
 
function TMyNetworkEvents.NetworkDeleted(networkId: TGUID): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('NetworkDeleted');
  Result := S_OK;
end;
 
function TMyNetworkEvents.NetworkPropertyChanged(networkId: TGUID; fFlags: NLM_NETWORK_PROPERTY_CHANGE): HResult; stdcall;
begin
  Form2.Memo1.Lines.Add('NetworkPropertyChanged');
  Result := S_OK;
end;
 
function StartNLMEventListener: HResult;
var
  pCpc: IConnectionPointContainer;
  pConnectionPoint: IConnectionPoint;
  pSink: INetworkEvents;
begin
  if pNLM = nil then
  begin
    Result := CoCreateInstance(CLASS_NetworkListManager, nil, CLSCTX_ALL, IID_INetworkListManager, pNLM);
    if Failed(Result) then
      Exit;
  end else
  begin
    Result := S_OK;
  end;
 
  if Succeeded(pNLM.QueryInterface(IID_IConnectionPointContainer, pCpc)) then
  begin
    pSink := TMyNetworkEvents.Create as INetworkEvents;
 
    if dwCookie1 = -1 then
    begin
      if Succeeded(pCpc.FindConnectionPoint(IID_INetworkEvents, pConnectionPoint)) then
      begin
        pConnectionPoint.Advise(pSink, dwCookie1);
        pConnectionPoint := nil;
      end;
    end;
 
    if dwCookie2 = -1 then
    begin
      if Succeeded(pCpc.FindConnectionPoint(IID_INetworkConnectionEvents, pConnectionPoint)) then
      begin
        pConnectionPoint.Advise(pSink, dwCookie2);
        pConnectionPoint := nil;
      end;
    end;
 
    if dwCookie3 = -1 then
    begin
      if Succeeded(pCpc.FindConnectionPoint(IID_INetworkListManagerEvents, pConnectionPoint)) then
      begin
        pConnectionPoint.Advise(pSink, dwCookie3);
        pConnectionPoint := nil;
      end;
    end;
  end;
end;
 
function StopNLMEventListener: HResult;
var
  pCpc: IConnectionPointContainer;
  pConnectionPoint: IConnectionPoint;
begin
  if pNLM <> nil then
  begin
    if Succeeded(pNLM.QueryInterface(IID_IConnectionPointContainer, pCpc)) then
    begin
      if dwCookie1 <> -1 then
      begin
        if Succeeded(pCpc.FindConnectionPoint(IID_INetworkEvents, pConnectionPoint)) then
        begin
          pConnectionPoint.Unadvise(dwCookie1);
          pConnectionPoint := nil;
        end;
      end;
 
      if dwCookie2 <> -1 then
      begin
        if Succeeded(pCpc.FindConnectionPoint(IID_INetworkConnectionEvents, pConnectionPoint)) then
        begin
          pConnectionPoint.Unadvise(dwCookie2);
          pConnectionPoint := nil;
        end;
      end;
 
      if dwCookie3 <> -1 then
      begin
        if Succeeded(pCpc.FindConnectionPoint(IID_INetworkListManagerEvents, pConnectionPoint)) then
        begin
          pConnectionPoint.Unadvise(dwCookie3);
          pConnectionPoint := nil;
        end;
      end;
    end;
 
    pNLM := nil;
  end;
 
  dwCookie1 := -1;
  dwCookie2 := -1;
  dwCookie3 := -1;
 
  Result := S_OK;
end;
 
end.
Вот код на С++ Builder, который я частично переделал

NLMEvents.h
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
#ifndef NLMEventsH
#define NLMEventsH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <SysUtils.hpp>  // здесь надо добавить наверно ещё  Windows, ActiveX, NETWORKLIST_TLBж
 
class TMyNetworkEvents : public System::TInterfacedObject  // а как  сюда вставить TInterfacedObject, INetworkEvents, INetworkConnectionEvents, INetworkListManagerEvents
{
public:
    HResult _stdcall ConnectivityChanged(NLM_CONNECTIVITY NewConnectivity);
    HResult _stdcall NetworkConnectionPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags);
    HResult _stdcall NetworkAdded(TGUID networkId);
    HResult _stdcall NetworkConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity);
    HResult _stdcall NetworkDeleted(TGUID networkId);
    HResult _stdcall NetworkPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags);
    HResult StartNLMEventListener;
    HResult StopNLMEventListener;
};
 
/*
var
  pNLM: INetworkListManager = nil;
  dwCookie1: LongInt = -1;
  dwCookie2: LongInt = -1;
  dwCookie3: LongInt = -1;                                                            ВОТ ЭТО ВСЁ ЗАКОМЕНТИРОВАННОЕ ВООБЩЕ НЕ ЗНАЮ КУДА ЛУЧШЕ ВСТАВЛЯТЬ
 
const
  IID_IConnectionPointContainer: TGUID = '{B196B284-BAB4-101A-B69C-00AA00341D07}';
 */
#endif
а вот NLMEvents.срр
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
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <vcl.h>
#include <windows.h>
#include <Netlistmgr.h>
 
#pragma hdrstop
#include "NLMEvents.h"
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
 
 
HResult _stdcall TMyNetworkEvents::ConnectivityChanged(NLM_CONNECTIVITY NewConnectivity)
{
  Form1->Memo1->Lines->Add("ConnectivityChanged");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult _stdcall TMyNetworkEvents::NetworkConnectionConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity)
{
  Form1->Memo1->Lines->Add("NetworkConnectionConnectivityChanged");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult _stdcall TMyNetworkEvents::NetworkConnectionPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags)
{
  Form1->Memo1->Lines->Add("NetworkConnectionPropertyChange");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult _stdcall TMyNetworkEvents::NetworkAdded(TGUID networkId)
{
  Form1->Memo1->Lines->Add("NetworkAdded");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult _stdcall TMyNetworkEvents::NetworkConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity)
{
  Form1->Memo1->Lines->Add("NetworkConnectivityChanged");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult _stdcall TMyNetworkEvents::NetworkDeleted(TGUID networkId)
{
  Form1->Memo1->Lines->Add("NetworkDeleted");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult _stdcall TMyNetworkEvents::NetworkPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags)
{
  Form1->Memo1->Lines->Add("NetworkPropertyChanged");
  return S_OK;
}
//-----------------------------------------------------------------------------
HResult StartNLMEventListener()
{
  IConnectionPointContainer *pCpc;
  IConnectionPoint *pConnectionPoint;
  INetworkEvents *pSink;
 
  if (pNLM == NULL)
  {
    if (FAILED(CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (void**) &pNLM)))
      {
       return 0;
      }
   else if
      {
      return S_OK;
      }
 
  if (SUCCEEDED(pNLM->QueryInterface(IID_IConnectionPointContainer, pCpc))
    {
    pSink = TMyNetworkEvents *INetworkEvents;
 
    if (dwCookie1 == -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, pConnectionPoint))
       {
        pConnectionPoint->Advise(pSink, dwCookie1);
        pConnectionPoint = NULL;
       }
     }
 
    if (dwCookie2 == -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, pConnectionPoint))
       {
        pConnectionPoint->Advise(pSink, dwCookie2);
        pConnectionPoint = NULL;
       }
     }
 
    if (dwCookie3 == -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, pConnectionPoint))
       {
        pConnectionPoint->Advise(pSink, dwCookie3);
        pConnectionPoint = NULL;
       }
     }
  }
 }
 
//-----------------------------------------------------------------------------
HResult StopNLMEventListener()
{
 IConnectionPointContainer *pCpc;
 IConnectionPoint *pConnectionPoint;
 
  if (pNLM != NULL)
  {
    if (SUCCEEDED(pNLM->QueryInterface(IID_IConnectionPointContainer, pCpc))
    {
      if (dwCookie1 != -1)
      {
        if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, pConnectionPoint))
        {
          pConnectionPoint->Unadvise(dwCookie1);
          pConnectionPoint = NULL;
        }
      }
 
      if (dwCookie2 != -1)
      {
        if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkConnectionEvents, pConnectionPoint))
        {
          pConnectionPoint->Unadvise(dwCookie2);
          pConnectionPoint = NULL;
        }
      }
 
      if (dwCookie3 != -1)
      {
        if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkListManagerEvents, pConnectionPoint))
        {
          pConnectionPoint->Unadvise(dwCookie3);
          pConnectionPoint = NULL;
        }
      }
    }
 
    pNLM = NULL;
  }
 
  dwCookie1 = -1;
  dwCookie2 = -1;
  dwCookie3 = -1;
 
  return S_OK;
 }
}

Unit1.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "NLMEvents.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
Заранее благодарен за ответ
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2015, 15:27
Ответы с готовыми решениями:

Перевод кода из Delphi на C++
Доброго вечера. Пожалуйста, помогите портировать код с Delphi на C++. Его не очень много, но есть некоторые компоненты, которых не могу...

Перевод кода с Delphi на С++
Доброго времени суток:) У меня возникла проблема с редиректом в synapse(про indy не говорите,я знаю,что там есть HandleRedirects) Вот...

Перевод кода из Delphi в C++
unit UDAL; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,...

53
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
07.05.2015, 09:22  [ТС]
Получилось перевести код, но почему-то при запуске выходит ошибка (см. скриншот)
Unit1.cpp
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
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include <Netlistmgr.h>
#include "Unit1.h"
 
 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  pNLM = NULL;
  dwCookie1 = -1, dwCookie2 = -1, dwCookie3 = -1;
  UnicodeString fg = "{B196B284-BAB4-101A-B69C-00AA00341D07}";
  IID_IConnectionPointContainer = StringToGUID(fg);
}
 
//-----------------------------------------------------------------------------
 HResult __stdcall TForm1::NetworkAdded(TGUID networkId)
{
  Form1->Memo1->Lines->Add("NetworkAdded");
  return S_OK;
}
HResult __stdcall TForm1::NetworkConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity)
{
  Form1->Memo1->Lines->Add("NetworkConnectivityChanged");
  return S_OK;
}
 
HResult __stdcall TForm1::NetworkDeleted(TGUID networkId)
{
  Form1->Memo1->Lines->Add("NetworkDeleted");
  return S_OK;
}
 
HResult __stdcall TForm1::NetworkPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags)
{
  Form1->Memo1->Lines->Add("NetworkPropertyChanged");
  return S_OK;
}
 
HResult __stdcall TForm1::ConnectivityChanged(NLM_CONNECTIVITY NewConnectivity)
{
  Form1->Memo1->Lines->Add("ConnectivityChanged");
  return S_OK;
}
HResult __stdcall TForm1::NetworkConnectionConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity)
{
  Form1->Memo1->Lines->Add("NetworkConnectionConnectivityChanged");
  return S_OK;
}
HResult __stdcall TForm1::NetworkConnectionPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags)
{
  Form1->Memo1->Lines->Add("NetworkConnectionPropertyChange");
  return S_OK;
}
//------------------------------------------------------------------------
HResult __stdcall TForm1::StartNLMEventListener()
{
  IConnectionPointContainer *pCpc;
  IConnectionPoint *pConnectionPoint;
  INetworkEvents *pSink;
  if (pNLM == NULL)
  {
    if (FAILED(CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (void**) &pNLM)))
      {
       ShowMessage("CoCreateInstance Failed");
       CoUninitialize();
       Application->Terminate();
       return 0;
      }
   /*else
      {
      return S_OK;
      }*/
 
    if (SUCCEEDED(pNLM->QueryInterface(IID_IConnectionPointContainer,(void**)&pCpc)))
    {
     if ((int)dwCookie1 == -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, &pConnectionPoint)))
       {
        pConnectionPoint->Advise(pSink, &dwCookie1);
        pConnectionPoint = NULL;
       }
     }
     if ((int)dwCookie2 == -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, &pConnectionPoint)))
       {
        pConnectionPoint->Advise(pSink, &dwCookie2);
        pConnectionPoint = NULL;
       }
     }
    if ((int)dwCookie3 == -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, &pConnectionPoint)))
       {
        pConnectionPoint->Advise(pSink, &dwCookie3);
        pConnectionPoint = NULL;
       }
     }
    }
   }
 
   return S_OK;
 
}
//------------------------------------------------------------------------------
HResult __stdcall TForm1::StopNLMEventListener()
{
  IConnectionPointContainer *pCpc;
  IConnectionPoint *pConnectionPoint;
 
  if (pNLM != NULL)
  {
   if (SUCCEEDED(pNLM->QueryInterface(IID_IConnectionPointContainer,(void**)&pCpc)))
    {
     if ((int)dwCookie1 != -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, &pConnectionPoint)))
       {
        pConnectionPoint->Unadvise(dwCookie1);
        pConnectionPoint = NULL;
       }
     }
     if ((int)dwCookie2 != -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, &pConnectionPoint)))
       {
        pConnectionPoint->Unadvise(dwCookie2);
        pConnectionPoint = NULL;
       }
     }
    if ((int)dwCookie3 != -1)
    {
      if (SUCCEEDED(pCpc->FindConnectionPoint(IID_INetworkEvents, &pConnectionPoint)))
       {
        pConnectionPoint->Unadvise(dwCookie3);
        pConnectionPoint = NULL;
       }
     }
    }
     pNLM = NULL;
 
  }
 
  dwCookie1 = -1;
  dwCookie2 = -1;
  dwCookie3 = -1;
 
  return S_OK;
 
}
//------------------------------------------------------------------------------
 
 
 
 
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StartNLMEventListener();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 StopNLMEventListener();
}
//---------------------------------------------------------------------------
Unit.h
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
 
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TMemo *Memo1;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    INetworkListManager *pNLM;
    TGUID IID_IConnectionPointContainer;
    DWORD dwCookie1, dwCookie2, dwCookie3;
    HResult __stdcall NetworkAdded(TGUID networkId);
    HResult __stdcall NetworkConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity);
    HResult __stdcall NetworkDeleted(TGUID networkId);
    HResult __stdcall NetworkPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags);
    HResult __stdcall ConnectivityChanged(NLM_CONNECTIVITY NewConnectivity);
    HResult __stdcall NetworkConnectionConnectivityChanged(TGUID networkId, NLM_CONNECTIVITY NewConnectivity);
    HResult __stdcall NetworkConnectionPropertyChanged(TGUID networkId, NLM_NETWORK_PROPERTY_CHANGE fFlags);
    HResult __stdcall StartNLMEventListener();
    HResult __stdcall StopNLMEventListener();
 
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Этот код необходимо запускать под операционкой не ниже Windows Vista

Ошибка при запуске
Миниатюры
Перевод кода Delphi  
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
07.05.2015, 09:28
Запускайте под отладчиком и трассеруйте код до возникновения ошибки.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
07.05.2015, 10:02
Лучший ответ Сообщение было отмечено Sasha как решение

Решение

Sasha, с каких пор Билдер разучился компилировать pas-файлы? Не занимайся самодеятельностью, импортируй библиотеку классов TLB, подключи к проекту приведенный выше pas-файл, чуть-чуть изменив его:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
unit NLMEvents;
 
interface
uses StdCtrls;
 
function StartNLMEventListener: HResult;
function StopNLMEventListener: HResult;
 
var
  Memo : TMemo; // изменение №1
 
implementation
 
uses
  Windows, ActiveX, NETWORKLIST_TLB, SysUtils; //, Unit1; // изменение №2
// дальше - без изменений
, и все обращения к Form2.Memo1.Lines.Add замени на Memo.Lines.Add...

Вот и все, теперь пересобери проект, подключи полученный в результате NLMEvents.hpp к своей форме, и сделай вот такой трюк:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Nlmevents::Memo = this->Memo1; // <-- Сюда будут сливаться все сообщения от NLM...
    StartNLMEventListener();
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    StopNLMEventListener();
}
Все прекрасно запускается, никаких ошибок, если работал исходный модуль, то и этот будет работать, не надо заниматься никому не нужными переводами с одного языка на другой.
2
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
07.05.2015, 10:27  [ТС]
Ок попробую
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
08.05.2015, 08:42  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
подключи полученный в результате NLMEvents.hpp
Он не создаётся потому как выдаётся ошибка при компиляции (см. скриншот)
Миниатюры
Перевод кода Delphi  
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
08.05.2015, 08:59  [ТС]
А всё понял ложная тревога

надо было в pas-файле дописать
interface
uses StdCtrls;


Добавлено через 11 минут
volvo, а если мне допустим необходимо будет дополниить эту программу дополнительным функционалом (к примеру сделать индикацию в трее), мне надо будет работать с Unit1 или мне придётся писать код в этом pas-Файле?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
08.05.2015, 12:04
Или делать всю обработку в pas-файле, или каким-то образом сообщать форме о наступлении события (скажем, отсылкой сообщения через SendMessage, handle формы можно передать аналогично тому, как был передан Memo), а на форме уже ловить это сообщение и делать все, что нужно.

Не по теме:

Вариант сделать в pas-файле переменную, некий индикатор того, какое именно событие произошло, изменять ее из pas-файла, а в cpp по таймеру ловить изменение и предпринимать какие-то действия - не предлагаю, неправильно это.

1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
08.05.2015, 15:56  [ТС]
volvo, тут ещё не совсем понятна разница в выводе сообщений вот к примеру чем отличается

NetworkConnectionPropertyChange и NetworkPropertyChanged?

Вот с этим NetworkAdded в принципе понятно на русском это будет выглядеть так Сетевой кабель поключён
Вот с этим тоже NetworkDeleted это на русском будет Сетевой кабель отключён

А вот как работает моя программа...
Беру вытягиваю кабель из сетевой карты и в Мемо пишется такое:

NetworkConnectivityChanged
ConnectivityChanged


потом я беру кабель и опять вставляю в сетевую карту и он мне пишет вот что:

NetworkAdded
NetworkConnectivityChanged
ConnectivityChanged
NetworkConnectivityChanged
ConnectivityChanged
NetworkConnectivityChanged
NetworkDeleted
ConnectivityChanged
NetworkConnectivityChanged
ConnectivityChanged

Вот из этого списка я понял, что происходит несколько раз подключение, потом вообще отключение чуть ли не кабеля NetworkDeleted, потом опять подключение и настройка. Во первых тут вопрос зачем столько раз подключаться. что б потом отключится и настроится, это так и надо или это глюк в программе или вообще может в Windows?

Может я не правильно расшифровал сообщения?

Заранее благодарен
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
08.05.2015, 16:09
Sasha, а ты добавь в каждое событие еще и расшифровку, как именно изменилось то или иное состояние (у ConnectivityChanged, NetworkConnectivityChanged, NetworkConnectionPropertyChange, NetworkConnectionConnectivityChanged и NetworkPropertyChanged же не один параметр, а два, второй как раз показывает, на что изменилось соответствующее состояние), и посмотри на полную картину, что именно происходит...
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
08.05.2015, 23:08  [ТС]
volvo, ты имеешь ввиду расшифровку вот это?
https://msdn.microsoft.com/en-... s.85).aspx
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
08.05.2015, 23:13
Да, именно это
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
08.05.2015, 23:32  [ТС]
Вот нашёл мануал как вытянуть значение
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
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
HRESULT PrintNetworkConnectivity(INetwork* pNetwork)
{
    HRESULT hr = S_OK;
    if(pNetwork != NULL)
    {
        NLM_CONNECTIVITY nlmConnectivity;
        hr = pNetwork->GetConnectivity(&nlmConnectivity);
        CComBSTR szConnectivity = L"";
        if( hr == S_OK)
        {
            if (nlmConnectivity == NLM_CONNECTIVITY_DISCONNECTED)
            {
                szConnectivity = L"network disconnected";
            }
 
            if (nlmConnectivity & NLM_CONNECTIVITY_IPV4_NOTRAFFIC)
            {
                if (szConnectivity.Length() != 0)
                {
                    szConnectivity += L" | ";
                }
                szConnectivity += L"network no traffic";
            }
 
            if (nlmConnectivity & NLM_CONNECTIVITY_IPV4_LOCALNETWORK)
            {
                if (szConnectivity.Length() != 0)
                {
                    szConnectivity += L" | ";
                }
                szConnectivity += L"IPv4 local connectivity";
            }
 
            if (nlmConnectivity & NLM_CONNECTIVITY_IPV4_INTERNET)
            {
                if (szConnectivity.Length() != 0)
                {
                    szConnectivity += L" | ";
                }
                szConnectivity += L"IPv4 internet connectivity";
            }
 
            if (nlmConnectivity & NLM_CONNECTIVITY_IPV6_LOCALNETWORK)
            {
                if (szConnectivity.Length() != 0)
                {
                    szConnectivity += L" | ";
                }
                szConnectivity += L"IPv6 local connectivity";
            }
 
            if (nlmConnectivity & NLM_CONNECTIVITY_IPV6_INTERNET)
            {
                if (szConnectivity.Length() != 0)
                {
                    szConnectivity +=   L" | ";
                }
                szConnectivity += L"IPv6 internet connectivity";
            }
        }
        if (SUCCEEDED(hr))
        {
               WCHAR result[MAX_LENGTH];
               wcscpy_s(result, _countof(result), szConnectivity);
               wprintf(L"Network Connectivity bitmask           : 0x%08x %s\n", nlmConnectivity, result);
        }
        else
        {
            wprintf(L"failed to get connectivity from INetwork ");
        }
    }
    return hr;
}
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 16:24  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Sasha, а ты добавь в каждое событие еще и расшифровку, как именно изменилось то или иное состояние (у ConnectivityChanged, NetworkConnectivityChanged, NetworkConnectionPropertyChange, NetworkConnectionConnectivityChanged и NetworkPropertyChanged же не один параметр, а два
volvo, пришлось ненадолго отложить создание проекта, сейчас опять вернулся. Пытаюсь сделать так для расшифровки в pas-файле.

Pascal
1
2
3
4
5
6
function TMyNetworkEvents.NetworkConnectionConnectivityChanged(networkId: TGUID; NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
  //Memo.Lines.Add('NetworkConnectionConnectivityChanged');
  Memo.Lines.Add(networkId: TGUID);
  Result := S_OK;
end;
Тут походу неправильно наверно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
15.06.2015, 16:26
Delphi
1
Memo.Lines.Add(GUIDToString(networkId));
?
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 16:59  [ТС]
volvo, спасибо с этими методами понятно, а что же делать вот с этим методом ведь здесь в параметрах нет networkId: TGUID, здесь наверно надо по смыслу придумывать?

Pascal
1
2
3
4
5
function TMyNetworkEvents.ConnectivityChanged(NewConnectivity: NLM_CONNECTIVITY): HResult; stdcall;
begin
* Form2.Memo1.Lines.Add('ConnectivityChanged');
* Result := S_OK;
end;
Добавлено через 21 минуту
Цитата Сообщение от volvo Посмотреть сообщение
Memo.Lines.Add(GUIDToString(networkId));
Кстати говоря, а нельзя ли сделать так чтобы оно писало не цифрами в прямоугольных скобках, а сделать чтобы оно писало буквами, что в данный момент происходит?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
15.06.2015, 18:58
Sasha, что в данный момент происходит - это не параметр networkId, а параметр NewConnectivity. networkId - это с чем происходит. Ты же выше сам показывал, как по NLM_CONNECTIVITY вывести описание действия.
Цитата Сообщение от Sasha Посмотреть сообщение
ведь здесь в параметрах нет networkId: TGUID
А нет здесь TGUID-а потому что это событие изменения состояния не у какого-то конкретного сетевого соединения, а вообще. Вот за ним сразу, следующим же событием, будет уточнение, с каким именно сетевым соединением произошло это изменение.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 19:25  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Ты же выше сам показывал, как по NLM_CONNECTIVITY вывести описание действия.
Да показывал, но прикрутить это всё у меня не хватает опыта
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33394 / 21504 / 8236
Регистрация: 22.10.2011
Сообщений: 36,900
Записей в блоге: 12
15.06.2015, 19:54
Цитата Сообщение от Sasha Посмотреть сообщение
но прикрутить это всё
очень просто:
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
procedure ShowConnMessage(conn: NLM_CONNECTIVITY); // пишешь доп. процедуру
begin
  if conn = NLM_CONNECTIVITY_DISCONNECTED then
    Memo.Lines.Add('network disconnected');
 
  if conn and NLM_CONNECTIVITY_IPV4_NOTRAFFIC <> 0 then
    Memo.Lines.Add('network no traffic');
 
  if conn and NLM_CONNECTIVITY_IPV4_LOCALNETWORK <> 0 then
    Memo.Lines.Add('IPv4 local connectivity');
 
  if conn and NLM_CONNECTIVITY_IPV4_INTERNET <> 0 then
    Memo.Lines.Add('IPv4 internet connectivity');
 
  if conn and NLM_CONNECTIVITY_IPV6_LOCALNETWORK <> 0 then
    Memo.Lines.Add('IPv6 local connectivity');
 
  if conn and NLM_CONNECTIVITY_IPV6_INTERNET <> 0 then
    Memo.Lines.Add('IPv6 internet connectivity');
end;
 
function TMyNetworkEvents.ConnectivityChanged(NewConnectivity: NLM_CONNECTIVITY) : HResult; stdcall;
begin
  Memo.Lines.Add('ConnectivityChanged');
  ShowConnMessage(NewConnectivity); // И вызываешь ее в каждом событии, где нужна диагностика
  Result := S_OK;
end;
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
15.06.2015, 20:20  [ТС]
Спасибо, попробую
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2015, 20:20
Помогаю со студенческими работами здесь

Перевод кода из Delphi в C++
Помогите друзья! это код Делфи.Переделать это на С++WITH OpenDialog1 Do If Executе Then begin Memo1.Visible:=True; { видимость...

Перевод кода из Delphi в C++
Ребята надо перевести код из Delphi в С++.procedure TF2_DAL.RaschetClick(Sender: TObject); var mas: array of Integer; i: integer; ...

Перевод кода из Delphi в C++
unit pr1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, RXClock,...

Перевод кода с Delphi на C++ Builder
Помогите перевести данный код (экспорт данных из ADOTable в Excel) с Delphi на C++ Builder. var XLApp,Sheet,Colum:Variant; ...

Перевод кода из Delphi 7 в C++ Builder 6
Подскажите, пожалуйста, как можно перевести код: TMemo(FindComponent('Memo' + IntToStr(i))).Lines.LoadFromFile(GetCurrentDir + '\db\' +...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru