Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58

С# обмен данными с DLL C++

17.10.2016, 13:26. Показов 3417. Ответов 12
Метки нет (Все метки)

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

Функция DLL на с++ в результате работы формирует строку типа _bstr_t
Эту строку нужно передать в код на С#

Делаю ледующим образом:
1. На С# получаю указатель на выделенный блок памяти и передаю его параметром в функцию dll на С++
2. В DLL создается строка с типом _bstr_t ID, которая преобразуется в массив char
и записывается по адресу переданному из С#в параметре

Проблема:
В С# приходит не вся строка, а только "BaseBoard="
Само значение _bstr_t BaseBoard не передается.
То есть передается только константная часть строки ID
Если передать только переменную_bstr_t BaseBoard то выскакивает исключение что передаваемое значение не может быть NULL

Хотя когда DLL функция тестируется как консольное приложение то все работает,
Переменная _bstr_t ID содержит и константную часть и значение переменной _bstr_t BaseBoard.

Помогите пожалуйста найти грабли.
Заранее благодарен всем откликнувшимся .

С#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[DllImport(@"D:\\ProjectsC++\\DLL\\MyDLL\\Debug\\MyDLL.dll",
                        EntryPoint = "GetString",
                        ExactSpelling = true,
                        CallingConvention = CallingConvention.Cdecl)]
 
public static extern int GetString(IntPtr pComputerName); 
 
 
var pComputerName = Marshal.AllocHGlobal(256);
// Вызываем описанную внешнюю функцию
GetString(pComputerName, ref size);
// Переводим результат в управляемый вид
var str = Marshal.PtrToStringUni(pComputerName);
//Освобождаем выделенную память
Marshal.FreeHGlobal(pComputerName);

С++:
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
define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>#
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
 
extern "C" __declspec(dllexport)  int GetString(char *pMemory)
{
    HRESULT hres;
    // Step 1: -------------------------------------------------- 
    // Initialize COM. ------------------------------------------
    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);  
    if (FAILED(hres)) 
    { 
        cout << "Failed to initialize COM library. Error code = 0x"  
            << hex << hres << endl; 
        return 1;                  // Program has failed. 
    }
    // Step 2: -------------------------------------------------- 
    // Set general COM security levels --------------------------
    hres =  CoInitializeSecurity( 
        NULL,  
        -1,                          // COM authentication 
        NULL,                        // Authentication services 
        NULL,                        // Reserved 
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication  
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation   
        NULL,                        // Authentication info 
        EOAC_NONE,                   // Additional capabilities  
        NULL                         // Reserved 
        );
    if (FAILED(hres)) 
    { 
        cout << "Failed to initialize security. Error code = 0x"  
            << hex << hres << endl; 
        CoUninitialize(); 
        return 1;                    // Program has failed. 
    }      
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
    IWbemLocator *pLoc = NULL;
    hres = CoCreateInstance( 
        CLSID_WbemLocator,              
        0, 
        CLSCTX_INPROC_SERVER,  
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres)) 
    { 
        cout << "Failed to create IWbemLocator object." 
            << " Err code = 0x" 
            << hex << hres << endl; 
        CoUninitialize(); 
        return 1;                 // Program has failed. 
    }
    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method 
    IWbemServices *pSvc = NULL; 
    // Connect to the root\cimv2 namespace with 
    // the current user and obtain pointer pSvc 
    // to make IWbemServices calls. 
    hres = pLoc->ConnectServer( 
         _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace 
         NULL,                    // User name. NULL = current user 
         NULL,                    // User password. NULL = current 
         0,                       // Locale. NULL indicates current 
         NULL,                    // Security flags. 
         0,                       // Authority (for example, Kerberos) 
         0,                       // Context object  
         &pSvc                    // pointer to IWbemServices proxy 
         );   
 
    if (FAILED(hres)) 
    { 
        cout << "Could not connect. Error code = 0x"  
             << hex << hres << endl; 
        pLoc->Release();      
        CoUninitialize(); 
        return 1;                // Program has failed. 
    }
    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
    // Step 5: -------------------------------------------------- 
    // Set security levels on the proxy -------------------------
    hres = CoSetProxyBlanket( 
       pSvc,                        // Indicates the proxy to set 
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx 
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx 
       NULL,                        // Server principal name  
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx  
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx 
       NULL,                        // client identity 
       EOAC_NONE                    // proxy capabilities  
    );
 
    if (FAILED(hres)) 
    { 
        cout << "Could not set proxy blanket. Error code = 0x"  
            << hex << hres << endl; 
        pSvc->Release(); 
        pLoc->Release();      
        CoUninitialize(); 
        return 1;               // Program has failed. 
    }
  // Step 6: -------------------------------------------------- 
    // Use the IWbemServices pointer to make requests of WMI ----
  // For example, get the name of the operating system 
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery( 
        bstr_t("WQL"),  
        bstr_t("SELECT * FROM Win32_BaseBoard"), 
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,  
        NULL, 
        &pEnumerator); 
    
    if (FAILED(hres)) 
    { 
        cout << "Query for operating system name failed." 
            << " Error code = 0x"  
            << hex << hres << endl; 
        pSvc->Release(); 
        pLoc->Release(); 
        CoUninitialize(); 
        return 1;               // Program has failed.
    }
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0; 
    while (pEnumerator) 
    { 
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,  
            &pclsObj, &uReturn); 
        if(0 == uReturn) 
        { 
            break; 
        } 
        VARIANT vtProp;
        // Get the value of the Name property 
        hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);  //BSTR vtProp
    _bstr_t BaseBoard(vtProp.bstrVal);
    _bstr_t ID = "BaseBoard=" + BaseBoard; 
    [B]//преобразуем _bstr_t ID в массив char и записываем его по переданному в параметре адресу[/B]
    strcpy_s(pMemory, ID.length() + 1, (LPCSTR)ID);
 
        VariantClear(&vtProp); 
        pclsObj->Release(); 
    }
    // Cleanup 
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
    
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.10.2016, 13:26
Ответы с готовыми решениями:

Обмен данными между c++ dll и c# приложением
Пишу программу, в которой требуется много Win32 Api вызовов. Препод сказал, что активное использование последних понижает...

Обмен данными
Всем привет. Попросили с нуля написать обмен данными между древней АльфаАвто и переписанной Бухгалтерией для Беларуси, да еще и подцепив...

Обмен данными
Добрый день. Не мог ли бы вы мне рассказать об обмене данными через интернет в дельфи? А именно, что мне надо. Использовать как...

12
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
17.10.2016, 13:54
Для примера. В DLL находится функция, принимающая строку, преобразующая её в BSTR, модифицирующая её и возвращающая обратно.

Объявление функции на стороне C++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
extern "C" {
    __declspec(dllexport) BSTR GetSomeText(const char* data)
    {
        BSTR result = NULL;
        int lenA = lstrlenA(data);
        int lenW = ::MultiByteToWideChar(CP_ACP, 0, data, lenA, NULL, 0);
        if (lenW > 0)
        {
            result = ::SysAllocStringLen(0, lenW);
            ::MultiByteToWideChar(CP_ACP, 0, data, lenA, result, lenW);
        }
        _bstr_t temp = result;
        temp += L" modified";
        result = temp;
        return result;
    }
}
Импорт в C#:
C#
1
2
3
[DllImport("Test.dll", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string GetSomeText(string query);
0
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
17.10.2016, 19:53  [ТС]
Exerion, спасибо за оперативный ответ.
Твой вариант рабочий и я его ранее пробовал, но он возвращает тот же результат.

В моем варианте моя функция не получает аргументов (ничего преобразовывать не надо)
Просто нужно возвратить _bstr_t result
Видимо vtProp.bstrVal не н приводится к типу _bstr_t , хотя в окне отладки
указывается BSTR

Если bstr_t result сделать константой (bstr_t result = "Const"), то все прокатывает, а как переменная - то нет...

C++
1
2
3
4
5
6
7
8
9
extern "C" {
    __declspec(dllexport) BSTR GetSomeText()
    {
 
        _bstr_t result = vtProp.bstrVal;  // строка 141 в моем коде
 
        return result;
    }
}
Я думаю, что неправильно делаю преобразование к типу который нужно вернуть в С#.
Можешь подсказать как правильно сделать преобразование?
Моих мозгов не хватает.

Спасибо
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
17.10.2016, 20:14
кусочек кода как я это делаю, может поможет
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
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using ADB.Util;
namespace ADb {
  public delegate int ADB_CALLBACK(int key1, int key2, string nam);
 
  [StructLayout(LayoutKind.Sequential)]
  public struct Adb_keys {
    public int keyi;
    public int nsost;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string namev;
  }
 
  public class ArchLib {
    private IntPtr _db;
    public int Open(string file) {
      int ret;
      adb_open(file, out _db, out ret, 0);
      return ret;
    }
 
    public unsafe int ReadInt(int key1, int key2, string nam, int def) {
      int ier = 0;
      int ret = def;
      int keyi = key1;
      int nsost = key2;
      int lend = 4;
      adb_read(ref _db, &keyi, &nsost, nam, &ret, &lend, &ier, 0);
      if(ier <= 0) {
        return def;
      }
      return ret;
    }
 
    [DllImport("ADB.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl,
    EntryPoint = "adb_open_r")]
    public static extern void adb_open_r(String namedb, out IntPtr db, out int ier, int len);
 
    [DllImport("ADB.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl,
    EntryPoint = "adb_open")]
    public static extern void adb_open(String namedb, out IntPtr db, out int ier, int len);
 
    [DllImport("ADB.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl,
    EntryPoint = "adb_create")]
    public static extern void adb_create(String namedb, out IntPtr db, out int ier, int len);
  }
}
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
17.10.2016, 20:19
arbit, обратите внимание на строчку при импорте функции
C#
1
[return: MarshalAs(UnmanagedType.BStr)]
0
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
17.10.2016, 23:42  [ТС]
Exerion , строка

[return: MarshalAs(UnmanagedType.BStr)] в наличии
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
18.10.2016, 09:04
arbit, ну в вашем примере этой строки не было.
Кроме того, если вы объявляете функцию именно так, то её не нужно маршалить вручную - никаких указателей и прочей лабуды. Просто выплёвываете из c++ данные в виде BSTR или преобразуете из _bstr_t, а в c# получаете данные в виде System.String. Строчка с объявлением маршалинга именно для этого и нужна.
0
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
22.10.2016, 20:53  [ТС]
Простите Уважаемые ГУРУ, что отрываю от важных дел!

Уже неделю бьюсь и не могу получить нужный результат
Ткните носом куда смотреть пожалуйста!!!

Еще раз условие задачи:
1 Есть код рабочей функции на сайте MSDN по работе с WMI привожу в конце сообщения

2 Результат этой функции, а это строка COM тип BSTR (строчка в основном коде 168 ),
нужно передать в С#

Как консольное приложение - все работает. а как DLL нет

Делаю следующим образом (строчка в основном коде 168):
копирую vtProp.bstrVal строку в _bstr_t result ( иначе результат прибьется при очистке памяти) и возвращаю.
Тип данных, возвращаемый функцией BSTR

При отладке кода в С# программа вылетает без указания ошибки в строке 7
пишет что программа завершилась некорректно и будет закрыта

Чувствую, что тут что-то с преобразованием типов, но вкурить не могу
Помогите пожалуйста. Не дайте умереть неучем.

Заранее благодарен.


C#
1
2
3
4
5
6
7
[DllImport(@"D:\\ProjectsC++\\DLL\\DLLPodolog\\Debug\\DLLPodolog.dll",
            EntryPoint = "GetSomeText", CharSet = CharSet.Unicode)]
        [return: MarshalAs(UnmanagedType.BStr)]
 
public static extern string GetSomeText();
 
 string result = GetSomeText();
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
176
177
178
179
180
181
182
183
184
#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <comdef.h>
#include <Wbemidl.h>
#pragma comment(lib, "wbemuuid.lib")
#include <comutil.h>
 
extern "C" __declspec(dllexport)  BSTR GetSomeText()
{
    _bstr_t resValue;  // Это переменная моя. В нее записываю результат, иначе при очистке памяти результат кода прибивается
 
    HRESULT hres;
 
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------
 
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        cout << "Failed to initialize COM library. Error code = 0x"
            << hex << hres << endl;
        return L"\0";                  // Program has failed.
    }
 
    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
 
    hres = CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );
 
 
    if (FAILED(hres))
    {
        cout << "Failed to initialize security. Error code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return L"\0";                  // Program has failed.
    }
 
    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------
 
    IWbemLocator *pLoc = NULL;
 
    hres = CoCreateInstance(
        CLSID_WbemLocator,
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *)&pLoc);
 
    if (FAILED(hres))
    {
        cout << "Failed to create IWbemLocator object."
            << " Err code = 0x"
            << hex << hres << endl;
        CoUninitialize();
        return L"\0";             // Program has failed.
    }
 
    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method
 
    IWbemServices *pSvc = NULL;
 
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
        _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
        NULL,                    // User name. NULL = current user
        NULL,                    // User password. NULL = current
        0,                       // Locale. NULL indicates current
        NULL,                    // Security flags.
        0,                       // Authority (for example, Kerberos)
        0,                       // Context object 
        &pSvc                    // pointer to IWbemServices proxy
        );
 
    if (FAILED(hres))
    {
        cout << "Could not connect. Error code = 0x"
            << hex << hres << endl;
        pLoc->Release();
        CoUninitialize();
        return L"\0";               // Program has failed.
    }
 
    cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;
 
 
    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------
 
    hres = CoSetProxyBlanket(
        pSvc,                        // Indicates the proxy to set
        RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
        RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
        NULL,                        // Server principal name 
        RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
        RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
        NULL,                        // client identity
        EOAC_NONE                    // proxy capabilities 
        );
 
    if (FAILED(hres))
    {
        cout << "Could not set proxy blanket. Error code = 0x"
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return L"\0";              // Program has failed.
    }
 
    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----
 
    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t("SELECT * FROM Win32_OperatingSystem"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator);
 
    if (FAILED(hres))
    {
        cout << "Query for operating system name failed."
            << " Error code = 0x"
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();
        CoUninitialize();
        return L"\0";              // Program has failed.
    }
 
    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------
 
    IWbemClassObject *pclsObj = NULL;
    ULONG uReturn = 0;
 
    while (pEnumerator)
    {
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
            &pclsObj, &uReturn);
 
        if (0 == uReturn)
        {
            break;
        }
 
        VARIANT vtProp;
 
        // Get the value of the Name property
        hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
        resValue = vtProp.bstrVal;
        //wcout << " OS Name : " << vtProp.bstrVal << endl;
        VariantClear(&vtProp);
        pclsObj->Release();
    }
 
    // Cleanup
    // ========
 
    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    CoUninitialize();
 
    return resValue;   // Program successfully completed.
 
};
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
22.10.2016, 21:17
У меня ваш код выдает ошибку
Failed to initialize security. Error code = 0x80010119
Если закомментировать весь С++ код "Step 2" то выдает следующее
Connected to ROOT\CIMV2 WMI namespace
Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk2\Partiti on1
0
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
22.10.2016, 21:31  [ТС]
Someone007, может у Вас не подключена библиотека "wbemuuid.lib"?

#include <comdef.h> - для работы с COM
#include <Wbemidl.h> Для WMI
#pragma comment(lib, "wbemuuid.lib")

Данная функция как консольное приложение работает только ее нужно переименовать в main для этого
Только что проверял
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
22.10.2016, 21:33
C#
1
2
3
4
5
6
7
8
9
10
11
12
string wmiQuery = "SELECT * FROM Win32_OperatingSystem";
 
using(ManagementObjectSearcher searcher = new ManagementObjectSearcher ( wmiQuery ))
{
   ManagementObjectCollection retObjectCollection = searcher.Get ( );
 
   foreach (ManagementObject retObject in retObjectCollection)
   {
       string result = retObject["Name"];
       break;
   }
}
Не понимаю, зачем вам вообще нужна библиотека на C++, когда всё можно сделать из шарпа без танцев с бубном.

P.S. писал без студии, возможно using нужно на коллекции ставить, а не на поисковике.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
22.10.2016, 21:39
Цитата Сообщение от arbit Посмотреть сообщение
Someone007, может у Вас не подключена библиотека "wbemuuid.lib"?
#include <comdef.h> - для работы с COM
#include <Wbemidl.h> Для WMI
#pragma comment(lib, "wbemuuid.lib")
Данная функция как консольное приложение работает только ее нужно переименовать в main для этого
Только что проверял
Так код компилится и запускается, то что я привел выше это вывод в консольном приложении C#, вызывающем функцию из С++ DLL.
Миниатюры
С# обмен данными с DLL C++  
0
1 / 1 / 1
Регистрация: 07.08.2015
Сообщений: 58
22.10.2016, 21:41  [ТС]
Exerion , я с Вам полностью согласен!!!
В С# все без проблем.

Но!
C# это управляемый код, а мне нужен НАТИВНЫЙ!!!
В С# мне нужно возвращать зашифрованные данные характеристик компьютера и передавать их потом на сайт для регистрации
А у С# открытые исходники (в Reflector)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.10.2016, 21:41
Помогаю со студенческими работами здесь

Обмен данными
Всем доброго времени суток! У меня такая ситуация: Учет в ЗУП ведется в демонстрационной базе (кто это сделал я не знаю... :D),...

Обмен данными
Есть программка (написана на Турбо Паскаль 7.0) и есть другая программа, которая написана на Паскаль АВС. Первая программа запускается из...

Обмен данными
Прошу помощи тех, кто имеет опыт обмена данными между разными конфигурациями. Есть внешняя обработка, запускающаяся в Бухгалтерии,...

Обмен данными
В планах обмена при выгрузке данных у нас удаляются изменения(ПланыОбмена.УдалитьРегистрациюИзменений(Узел)). Обмен не дошел до узла. При...

Обмен данными м/у УТ И БП
Здравствуйте, уважаемые форумчане. У меня возникла такая проблема: Всегда делали обмен между УТ 10.3 и БП 2.0 посредством...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru