2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение04.02.2016, 18:34 


12/05/07
579
г. Уфа
Ранее я рассказывал здесь о проблеме создания библиотеки DLL в Visual С++ 2005 Express Edition и её вызове из Maple. Эта проблема решиласть. Я благодарю всех, кто откликнулся и помог нам. По результатам проведённых вычислений мной и моими студентами была написана статья arXiv:1601.00636. В приложении к этой статье приведены исходные файлы DLL библиотеки, а также makefile и makefile.bat для их компиляции. DLL библиотека создаётся запуском makefile.bat. В этом файле используется переменная окружения VS80COMNTOOLS, которая соответствует Visual Studio 8. Если у Вас в Program Files стоит Visual Studio 9 или Visual Studio 10, то makefile.bat следует отредактировать и заменить VS80COMNTOOLS на VS90COMNTOOLS или VS100COMNTOOLS соответственно. Проверено, что во всех этих случаях библиотека DLL успешно создаётся и успешно работает при вызове из Maple 9, Maple 13 и Maple 16. Maple 9 и Visual Studio 8 использовались в Windows XP. В остальных случаях все происходило на платформе Windows 7.

Теперь мы решили сделать код независимым от Maple, заменив его оконным приложением, написанным на С++. Менять код DLL библиотеки, способ её создания, а также линковать её к с оконным приложением на С++ не хочется. Делается это для того, чтобы впоследствии студенты смогли в качестве тренировки создавать оболочки на Delphi, Java и может быть даже на HTML+Java Script к одной и той же DLL библиотеке.

Теперь опишу проблему. В графическом конструкторе Visual С++ создаю оконное приложение с одной формой и несколькими кнопками на ней. Образуются два файла ProjectName.cpp и Form1.h. Первый я вообще не трогаю. А во второй дописываю свой код.

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include "windows.h"
#include "string.h"
#include <stdio.h>
namespace ProjectName {
............................................................
 public ref class Form1 : public System::Windows::Forms::Form
 {
  private:
  // добавляю поля класса Form1
   HMODULE  My_DLL_Handle;
   LPCWSTR  My_DLL_WName;
   LPCSTR   My_Proc_Name;
   char * My_buffer;
   typedef unsigned int (__stdcall * Load_Cuboid_Binaries_ptr)();
   Load_Cuboid_Binaries_ptr Load_Cuboid_Binaries;
   unsigned int My_Proc_Result;
  // далее следует метод, который является конструктором
  public:
   Form1(void)
   {
    InitializeComponent();
    //TODO: Add the constructor code here
    // Сказано дрбавлять - значит добавляю
    this->My_DLL_WName = L"C:\\users\\...\\Cuboid_search_v01.dll";
    this->My_Proc_Result = 1;
    this->My_DLL_Handle = LoadLibrary(My_DLL_WName);
    this->My_Proc_Result = GetLastError(); // здесь в отладчике код ошибки 0, библиотека грузится
    this->My_buffer = new char[64];
    sprintf(My_buffer,"My_DLL_Handle =%I32X",My_DLL_Handle);
    this->My_Proc_Name = "_Load_Cuboid_Binaries@0";
    this->My_Proc_Result = 1;
    this->Load_Cuboid_Binaries = (Load_Cuboid_Binaries_ptr)GetProcAddress(My_DLL_Handle,My_Proc_Name);
    this->My_Proc_Result = GetLastError(); // здесь в отладчике код ошибки тоже 0
    // это значит функция Load_Cuboid_Binaries в библиотеке найдена
    // однако указатель Load_Cuboid_Binaries в отладчике даёт <undefined value>
    sprintf(My_buffer,"Load_Cuboid_Binaries=%I32X",Load_Cuboid_Binaries);
     // после преобразования в строку видно, что указатель нулевой
    }
  protected:
  ...............................................................
  private:
  // здесь реакция на нажатие кнопки
   System::Void button1_Click(System::Object^ sender,System::EventArgs^ e)
   {
    this->My_Proc_Result = this->Load_Cuboid_Binaries();
    // она ожидаемым образом приводит к ошибке unhandled exception
    // Attempted to read or write protected memory
   }
 };
}
Точками я обозначил стандартный код, графическим конструктором форм Visual С++. Спецификатор this-> можно везде убрать. Он ни на что не влияет.

Резюмируя сказанное в комментариях к коду, скажу, что библиотека грузится, требуемая функция в ней находится, хотя имя функции слегка искажено. Это я учитываю при вызове GetProcAddress. Функция GetProcAddress срабатывает с нулевым кодом ошибки, но возвращает нулевой указатель (NULL), который не может использоваться для вызова функции Load_Cuboid_Binaries() в загруженной библиотеке DLL. Пожалуйста, помогите разобраться в чём дело.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение04.02.2016, 19:36 


08/10/10
50
Ruslan_Sharipov в сообщении #1096797 писал(а):
Используется синтаксис C++
    this->Load_Cuboid_Binaries = (Load_Cuboid_Binaries_ptr)GetProcAddress(My_DLL_Handle,My_Proc_Name);
    this->My_Proc_Result = GetLastError(); // здесь в отладчике код ошибки тоже 0
    // это значит функция Load_Cuboid_Binaries в библиотеке найдена
 

Неправда ваша. Это не значит, что функция найдена. Что она не найдена, вы можете видеть в последующих строчках.

Скорее всего, вы неправильное имя даете функции GetProcAddress. Чтобы посмотреть, какое правильное, можно использовать команду dumpbin.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение04.02.2016, 20:31 


12/05/07
579
г. Уфа
По Вашему совету я выполнил следующую команду из командной строки Visual Studio 2005 Command Prompt:

dumpbin /EXPORTS C:\users\...\Cuboid_search_v01.dll > exports.txt

Привожу содержимое получившегося файла exports.txt:
код: [ скачать ] [ спрятать ]
Используется синтаксис Text
Section contains the following exports for Cuboid_search_v01.dll

    00000000 characteristics
    56B33AD5 time date stamp Thu Feb 04 16:49:41 2016
        0.00 version
           1 ordinal base
          14 number of functions
          14 number of names

    ordinal hint RVA      name

          1    0 00001DC0 _Calculate_Q_pq_mod_prime@16
          2    1 00001E80 _Close_pq_file_stream@0
          3    2 00001840 _Get_current_p@0
          4    3 00001860 _Get_current_r_max@0
          5    4 00001880 _Get_prime@4
          6    5 00001E40 _IntTest@0
          7    6 000018A0 _Is_unsolvable@12
          8    7 00001000 _Load_Cuboid_Binaries@0
          9    8 00001E60 _Open_pq_file_stream@0
         10    9 000011A0 _Release_Cuboid_Binaries@0
         11    A 00001E00 _ShortTest@0
         12    B 00001710 _Start_searching@8
         13    C 00001820 _Stop_searching@0
         14    D 00001E90 _Write_pq_file_stream@4

  Summary

        4000 .data
        A000 .rdata
        3000 .reloc
       26000 .text

Вроде бы с именем _Load_Cuboid_Binaries@0 я не ошибся. Если взять другое имя, возникает код ошибки 127.

Про dumpbin я не знал. Спасибо за информацию. Ранее я использовал Dependency Walker (depends.exe).

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение04.02.2016, 21:43 


08/10/10
50
iakovk в сообщении #1096805 писал(а):
Неправда ваша. Это не значит, что функция найдена.
Прошу меня извинить. Был неправ. Я забыл, что GetProcAddress тоже ставит Last Error.
Ruslan_Sharipov в сообщении #1096819 писал(а):
Про dumpbin я не знал. Спасибо за информацию. Ранее я использовал Dependency Walker (depends.exe).
Это одно и то же - в смысле выдает ту же информацию.
Посмотрите сюда. Здесь показано как можно включить отладочные сообщения загрузчика:
Цитата:
LoadLibrary is one of the mostly used yet unbelieveably complex APIs in Windows, if not the one. Russ Osterlund has a full MSDN article discussing LoadLibrary, yet he only touches the surface of the problem (how it works under normal condition.) Mike Grier is one of the most talented developers I have worked with in Microsoft. He devoted a full series on the intricacy of LoadLibrary. Yet he has to put it to a halt due to the complexity of the problem.

For developers that outside of the loader team, they don't have to understand all the intricacy of LoadLibrary (though they do need to understand how it works, the dos and don'ts of LoadLibrary, etc.). But then LoadLibrary fails, they do need to figure out why it fails. There are times that this is just hard to figure out why, especially when the binary depends on other dlls that they don't have source code available.

Fortunately, the loader team recognized the problem, and provided a built-in trace log to debug obsure LoadLibrary failures. The trace log is called "loader snaps" internally.

You can turn on loader snaps using gflags.exe. gflags.exe is part of Debugging Tools for Windows. You can download it from http://www.microsoft.com/whdc/devtools/ ... fault.mspx.

To enable loader snaps, run "gflags.exe -i your-app-without-path.exe +sls"
...
Если вы сделаете как там написано и запустите вашу программу в отладчике, вы увидите сообщения от загрузчика (вообще все сообщения, а не только касательно вашей DLL. При этом программа сильно замедлится, имейте в виду). Возможно среди них и найдется какое-нибудь, которое прольет свет на вашу проблему.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение05.02.2016, 05:06 


12/05/07
579
г. Уфа
iakovk. Спасибо за информацию. Я ею воспользуюсь чуть позже. Пока что я обнаружил следующее. Функция LoadLibrary возвращает HMODULE, который, как я понимаю, является указателем. В моем случае он всякий раз равен 0x03440000. Независимо от того, сколько разных приложений запущено одновременно с Visual C++. Значение, на которое указывает это указатель в отладчике обозначено как unused=0x905a4d. По всей видимости это должно означать, что DLL не используется. Не используется другими приложениями или вообще не используется? Чтобы выяснить это, я запустил программу на Maple, которая загружает данную DLL и вызывает в ней рассматриваемую нами функцию Load_Cuboid_Binaries. После этого ситуация в отладчике не поменялась. Возникает вопрос - почему? Я останавливаю отладку, закрываю Visual C++ и пытаюсь удалить файл DLL. Он не удаляется. То есть библиотека DLL действительно занята и удерживается процессом из Maple.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение05.02.2016, 06:40 


11/12/14
893
У вас еще и managed C++ от MS. Это может добавлять сложностей. Находится, например, одна тема где проблема была в том, что GetLastError не находилась в следующей же строке кода, т.к. рантайм может неявно дёргать что-то, что обнулит GetLastError. Но на ваш случай как раз не похоже.
В порядке бреда оттуда же - попробуйте передь GetProcAddress и GetLastError поставить ::. Т.е. ::GetLastError() и т.п.

-- 05.02.2016, 07:42 --

Ruslan_Sharipov в сообщении #1096909 писал(а):
В моем случае он всякий раз равен 0x03440000. Независимо от того, сколько разных приложений запущено одновременно с Visual C++.


Эм... Приложения Win существуют в разных адресных пространствах и никак друг на друга не влияют, если не делать этого специально. Так что тут ничего интересного нет.

-- 05.02.2016, 07:44 --

P.S.

Еще одна догадка навскидку - попробуйте проблемный код вынести из конструктора формы. Вариант тоже бредовый, но мало ли.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение05.02.2016, 10:45 


08/10/10
50
Ruslan_Sharipov в сообщении #1096909 писал(а):
Функция LoadLibrary возвращает HMODULE, который, как я понимаю, является указателем.

Да, является. На первый байт соответстыующего файла.
Ruslan_Sharipov в сообщении #1096909 писал(а):
В моем случае он всякий раз равен 0x03440000. Независимо от того, сколько разных приложений запущено одновременно с Visual C++.

А как бы вы хотели?
Ruslan_Sharipov в сообщении #1096909 писал(а):
Значение, на которое указывает это указатель в отладчике обозначено как unused=0x905a4d. По всей видимости это должно означать, что DLL не используется.

Ничего подобного. unused это всего лишь имя поля. См. в файле winnt.h:
Используется синтаксис C++
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
 
и
Используется синтаксис C++
DECLARE_HANDLE(HINSTANCE);
typedef HINSTANCE HMODULE;      /* HMODULEs can be used in place of HINSTANCEs */
 
в файле minwindefs.h.
а 0x905a4d это всего лишь четыре первых байта вашего файла (DLL).
Ruslan_Sharipov в сообщении #1096909 писал(а):
После этого ситуация в отладчике не поменялась. Возникает вопрос - почему?

А должна? Чего вы хотели?
Ruslan_Sharipov в сообщении #1096909 писал(а):
Я останавливаю отладку, закрываю Visual C++ и пытаюсь удалить файл DLL. Он не удаляется. То есть библиотека DLL действительно занята и удерживается процессом из Maple.

Да, удерживается. Еще один способ в этом убедиться - запустить Process Explorer. Нажимаете Ctrl-F и в поле для поиска вводите имя вашей DLL. Или любую его подстроку. Результат - хэндлы всех файлов с подходящим именем, открытых всеми процессами в системе. В вашем случае вы увидите процесс Maple в списке.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение05.02.2016, 12:19 


08/10/10
50
У меня, однако, все работает (в консольном приложении).
Код:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <Windows.h>
#include <iostream>

using namespace std;

void main()
{
        auto hm = LoadLibrary(R"(D:\Projects\SDKSamples\dxdytest\Cuboid_search_v01\Debug\Cuboid_search_v01.dll)");
        if (hm == NULL)
        {
                DWORD dwErr = GetLastError();
                cout << "LoadLibrary failed: dwErr = " << dwErr << "\n";
                return;
        }
        cout << "hm = " << (PVOID) hm << "\n";
        auto pp = GetProcAddress(hm, "_Load_Cuboid_Binaries@0");
        if (pp == NULL)
        {
                DWORD dwErr = GetLastError();
                cout << "GetProcAddress failed: dwErr = " << dwErr << "\n";
                return;
        }
        cout << "pp = " << (PVOID)pp << "\n";
}

Результат:
Код:
hm = 0F4C0000
pp = 0F4D15FF
Для продолжения нажмите любую клавишу . . .

Cuboid_search_v01.dll - это файл, скомпилированный прямо из вашего кода.

Все это - в Visual Studio 2015.

-- Пт фев 05, 2016 13:23:38 --

В CLR варианте тоже работает (опять-таки в консольном приложении).
Код:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
// DllTest1.cpp : main project file.

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
        auto hm = LoadLibrary(LR"(D:\Projects\SDKSamples\dxdytest\Cuboid_search_v01\Debug\Cuboid_search_v01.dll)");
        if (hm == NULL)
        {
                DWORD dwErr = GetLastError();
                Console::WriteLine(L"LoadLibrary failed: dwErr = {0}", dwErr);
                return 0;
        }
        Console::WriteLine(L"hm = {0}", (IntPtr)hm);
        auto pp = GetProcAddress(hm, "_Load_Cuboid_Binaries@0");
        if (pp == NULL)
        {
                DWORD dwErr = GetLastError();
                Console::WriteLine(L"GetProcAddress failed: dwErr = {0}", dwErr);
                return 0;
        }
        Console::WriteLine(L"pp = {0}", (IntPtr)pp);
        return 0;
}
 

Результат:
Код:
hm = 263061504
pp = 263132671
Для продолжения нажмите любую клавишу . . .

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение07.02.2016, 06:25 


12/05/07
579
г. Уфа
aa_dav в сообщении #1096913 писал(а):
Еще одна догадка навскидку - попробуйте проблемный код вынести из конструктора формы.
Перенёс всё в обработчик нажатия кнопки. Не помогает.
iakovk в сообщении #1096936 писал(а):
У меня, однако, все работает (в консольном приложении) ... Все это - в Visual Studio 2015.
Visual Studio 2015 установить не могу. У меня довольно старый компьютер 2004 года покупки, Win XP и 500 Mb оперативной памяти. Кроме того, Visual С++ 2005 Extpress Edition - это бесплатный продукт. Созданный с его помощью код я могу официально распространять. Но есть минусы. Здесь есть опция создания Win Forms Application через Wizard (мастер создания проектов). Этой опцией я и воспользовался, когда нарисовал панель с кнопками. Но полученный проект оказался CLR проектом. Если выключить опцию CLR, то графический интерфейс по созданию форм и кнопок отключается, а созданный с его помощью код перестаёт компилироваться. Возможно вся проблема в этом. Моя DLL библиотека генерируется с выключенной опцией CLR. Вопрос: может ли такая библиотека загружаться и работать в CLR приложении с графическим интерфейсом?

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение07.02.2016, 10:08 


08/10/10
50
Ruslan_Sharipov в сообщении #1097596 писал(а):
Вопрос: может ли такая библиотека загружаться и работать в CLR приложении

Скорее всего может. Мой CLR пример это демонстрирует. По крайней мере GetProcAddress срабатывает успешно. Если вы скажете, что ваша функция должна делать, я попробую ее вызвать и тогда на этот вопрос получится окончательный ответ.
Ruslan_Sharipov в сообщении #1097596 писал(а):
с графическим интерфейсом?

А это несущественно. WinForms это всего лишь одна из .Net библиотек и она не препятствует использованию других. Более существенно, какая версия .Net у вас. У меня - 4.5.2. Попробуйте запустить мою консольную программку и посмотрите, будет NULL или нет.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение07.02.2016, 19:50 


09/05/10
122
Ростов-на-Дону
Ruslan_Sharipov в сообщении #1096797 писал(а):
HMODULE My_DLL_Handle;

Обратите внимание на букву "H" в "HMODULE" и на слово "Handle" в "My_DLL_Handle".

Ruslan_Sharipov в сообщении #1096909 писал(а):
Функция LoadLibrary возвращает HMODULE, который, как я понимаю, является указателем.

Возвращает дескриптор вашей библиотеки(исполнимого модуля).

iakovk в сообщении #1096928 писал(а):
Ruslan_Sharipov в сообщении #1096909
писал(а):
Функция LoadLibrary возвращает HMODULE, который, как я понимаю, является указателем.
Да, является. На первый байт соответстыующего файла.

Не байт, а DWORD.

iakovk в сообщении #1096928 писал(а):
а 0x905a4d это всего лишь четыре первых байта вашего файла (DLL).

Четыре байта и есть DWORD.
В этом причина, возможно.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение08.02.2016, 05:25 


12/05/07
579
г. Уфа
iakovk в сообщении #1097603 писал(а):
Попробуйте запустить мою консольную программку и посмотрите, будет NULL или нет.
Попробовал ту, что без CLR. Оказалось, что здесь ситуация даже хуже, чем с оконным вариантом. Тип auto у меня не воспринимается. Пришлось явно прописывать HMODULE. После этого LoadLibrary выдаёт ошибку 126. Сейчас я снёс Visual C++ 2005 Express Edition и Platform SDK. Буду переустанавливать. Или же попробую увеличить оперативную память и поставить более старшую версию, где имеется MFC. Какой вариант Вы порекомендуете на этот случай?

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение08.02.2016, 09:08 
Заслуженный участник


12/07/07
4522
Не только в 2005 Express, но и в 2008 Express возможно будут затруднения.

Если вариант с различными dll — для Maple с extern "C" и для VC приложения без extern "C" (как я предлагал в сообщении post1077394.html#p1077394) — не подходит (и разбираться не хочется, а надо побыстрей), то можно вызывать получить адрес функции dll по номеру (а не по имени); см. def-файлы.

Сегодня постараюсь посмотреть, как обстоят дела в 2010 Express Edition.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение08.02.2016, 16:28 


08/10/10
50
Ruslan_Sharipov в сообщении #1097812 писал(а):
Попробовал ту, что без CLR.

Я имел в виду ту, что с CLR.
Ruslan_Sharipov в сообщении #1097812 писал(а):
Оказалось, что здесь ситуация даже хуже, чем с оконным вариантом.

Ну прям, хуже. Вы уж скажете... :-)
Ruslan_Sharipov в сообщении #1097812 писал(а):
Тип auto у меня не воспринимается. Пришлось явно прописывать HMODULE.

Ключевое слово auto из новой версии языка (since C++11). Поддерживается Visual Studio начиная с 2010. Но ведь можно и без него. То есть замените два вхождения auto на HMODULE и FARPROC соответственно.
То же самое относится к
Код:
LR"(D:\Projects\SDKSamples\dxdytest\Cuboid_search_v01\Debug\Cuboid_search_v01.dll)"
Согласитесь, что это приятнее, чем
Код:
L"D:\\Projects\\SDKSamples\\dxdytest\\Cuboid_search_v01\\Debug\\Cuboid_search_v01.dll"
:-)
Ruslan_Sharipov в сообщении #1097812 писал(а):
После этого LoadLibrary выдаёт ошибку 126.

Это означает, что путь к DLL вы указали неправильный.
Ruslan_Sharipov в сообщении #1097812 писал(а):
Сейчас я снёс Visual C++ 2005 Express Edition и Platform SDK. Буду переустанавливать.

Если только из-за того, что вы указали выше, то это перебор.
Ruslan_Sharipov в сообщении #1097812 писал(а):
Или же попробую увеличить оперативную память и поставить более старшую версию, где имеется MFC.

А что, более старшая версия на вашу конфигурацию не встает? С MFC лучше чем без.

 Профиль  
                  
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение08.02.2016, 23:34 
Заслуженный участник


12/07/07
4522
Я попробовал создать в VC 2010 Express Edition примитивный вариант библиотеки и подключить к Win32 консольному приложению. В таком примитивном варианте все компилируется.

1. Создаем dll
Используется синтаксис C++
 // MyDLL.h
extern "C" __declspec(dllexport) int __stdcall prod(int a, int b);
extern "C" __declspec(dllexport) int __stdcall sum(int a, int b);
Используется синтаксис C++
// MyDll.cpp : Defines the exported functions for the DLL application.

#include "stdafx.h"
#include "MyDLL.h"

int __stdcall prod(int a, int b)
{
        return a*b;
}
int __stdcall sum(int a, int b)
{
        return a+b;
}
Копируем MyDll.lib в папку …\VC\lib.

2. Создаём Win32 консольное приложение.
New Project \ Win32 \ Win32 Console Application (Visual C++)
Application Settings. Application type: Console application; Application options: Precompiled header.
В Solution Explorer добавляем в список Header Files MyDll.h
2A. Статическое подключение dll.
Используется синтаксис C++
 // MyDllTst.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include "MyDLL.h"
#pragma comment(lib, "MyDll.lib")

int _tmain(int argc, _TCHAR* argv[])
{
   int s, p;
   s = sum(1, 2);
   p = prod(2, 2);
   return 0;
}
Компилируется. Ожидаемо выполняется.

Динамическое постараюсь нарисовать позже.
[Написанное дико банально, но может быть поможет.]

-- Пн 08.02.2016 23:08:12 --

2B. Динамическое подключение dll.
[Не включаем в список Header Files MyDll.h]
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
 // MyDllTst.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
  HINSTANCE hMyDll;
  if((hMyDll=LoadLibraryA("MyDLL"))==NULL)
   return 1;
  else
   {
    typedef int (__stdcall *tprod)( int, int );
    typedef int (__stdcall *tsum)( int, int );
    tprod prod = (tprod)GetProcAddress(hMyDll, "_prod@8");
    tsum sum = (tsum)GetProcAddress(hMyDll, "_sum@8");
    int s = sum(1, 2);
    int p = prod(2, 2);
    FreeLibrary(hMyDll);
    return 0;
   }
}
Компилируется и ожидаемо работает.

Upd (утро 9.02.2016). Я пробовал VC EE 2010 на старой машине: процессор Phenom II, X4 975, жесткий диск 500 Гб (7200), 2 Гб медленной памяти (DDR3 1333). ОC: Windows server 2003. Грузиться среда достаточно быстро.

Upd 2 (вечер 9.02.2016). Регистрация online прекращена, поэтому получить registration key из среды EE 2008 или 2010 (Help \ Register Product) не получится. Для регистрации VC EE 2010 можно воспользоваться ключом из сообщения http://www.programbeginner.ru/?p=356 (Инсталляция мною скачивалась с офф. сайта. MS.)
[Это не совсем пиратство. Просто MS перешёл на поддержку более современных (бесплатных) версий продуктов, а старые (бесплатные) не поддерживает.]

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group