2014 dxdy logo

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

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




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


08/10/10
50
GAA в сообщении #1097817 писал(а):
Не только в 2005 Express, но и в 2008 Express возможно будут затруднения.

У меня в 2005 все работает:
Код:
hm = 15794176
pp = 15864408
Press any key to continue . . .

Visual Studio 2005 Professional, Windows XP Professional SP3.
Текст программы:
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
// DllTest1.cpp : main project file.

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
        HMODULE hm = LoadLibrary(L"C:\\Documents and Settings\\admin\\My Documents\\Visual Studio 2005\\Projects\\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);
        PVOID 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;
}
 

Это та же программа, что и в варианте для VS2015, только немножко адаптированная под "древний" язык.

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


12/07/07
4522
iakovk, спасибо! Я писал не про этот конкретный проект. У меня были затруднения с загрузкой в VC++ 2008 EE, но я быстро их поборол и не сохранил текст. О проблемах с 2005 EE слышал от коллеги. (Сам с 2005 EE никогда не игрался.) На сегодняшний день в ближайшем окружении нет ни 2005 EE, ни 2008 EE.

Поэтому я в 2010 EE создал CLR Windows Forms Application, скопировав, за исключением расположения dll, начало текста из стартового сообщения темы. (И назвав проект CuboidDllTst.)
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#pragma once
#include "windows.h"
#include "string.h"
#include <stdio.h>

namespace CuboidDllTst {

        using namespace System;
        using namespace System::ComponentModel;
        using namespace System::Collections;
        using namespace System::Windows::Forms;
        using namespace System::Data;
        using namespace System::Drawing;

        /// <summary>
        /// Summary for Form1
        /// </summary>
        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"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();
Указателю Load_Cuboid_Binaries присваивается ненулевое значение (0x10001000). Дальше не проверял.
Add И кнопка у меня одна.( На вторую сил не хватило. :-))

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


12/07/07
4522
Нет. Тут я поспешил и заврался. Сейчас перепроверю.

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


12/07/07
4522
В общем, как-то грузиться… Но текст в начальном сообщении — это не для CLR.

Если городить CLR, то мне было бы проще (стандартно) использовать атрибут DllImport.
В случае MyDll.dll из моего сообщения.
Описываем
[DllImport("MyDll.dll")]
extern "C" int prod(int a, int b);

Потом просто вызываем
int p = prod(2, 3);
Получаем ожидаемый результат: 6.
Аналогично, думаю, и для проекта из начального сообщения.

[Т.е. надо литературу посмотреть. Я CLR не изучал. Оконные приложения в C++ VS EE не писал. С ходу нагуглил Функциональная совместимость. Глава из книги “C++/CLI: язык Visual C++ для среды .NET” и несколько учебников. Как будто там все достаточно подробно написано. Учебники не перечисляю. Будем надеяться, зайдут знатоки VS и CLR — порекомендуют со знанием дела.]

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


08/10/10
50
GAA в сообщении #1098569 писал(а):
Но текст в начальном сообщении — это не для CLR.

Ну почему же?
Ruslan_Sharipov в сообщении #1096797 писал(а):
В графическом конструкторе Visual С++ создаю оконное приложение с одной формой и несколькими кнопками на ней.

Далее там идет код именно для WinForms, т.е. CLR. Это даже неплохо, имея в виду намерение Ruslan_Sharipov
Ruslan_Sharipov в сообщении #1096797 писал(а):
чтобы впоследствии студенты смогли в качестве тренировки создавать оболочки на Delphi, Java и может быть даже на HTML+Java Script к одной и той же DLL библиотеке.

Так что как учебная эта задачка вполне нормальна: научиться пользоваться этим аппаратом (LoadLibrary/GetProcAddress).
GAA в сообщении #1098569 писал(а):
Если городить CLR, то мне было бы проще (стандартно) использовать атрибут DllImport.

Мне тоже. Но ведь так тоже работать должно. Почему не работает у Ruslan_Sharipov, непонятно. У меня такое подозрение, что он свою ситуацию описал неправильно.
GAA в сообщении #1098569 писал(а):
Т.е. надо литературу посмотреть. Я CLR не изучал.

Я тоже. Боюсь, однако, что те тонкости, о которых здесь идет речь, в литературе не описаны. Если очень сильно хочется, можно исходники coreclr посмотреть.

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


27/04/09
28128

(Оффтоп)

А зачем использовать C++ и CLR вместе? CLR-ный P/Invoke использует ведь в конечном итоге те же функции LoadLibrary, GetProcAddress и др..

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

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



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

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


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

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