2014 dxdy logo

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

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




На страницу Пред.  1, 2
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение10.02.2016, 18:49 
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 
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 
Нет. Тут я поспешил и заврался. Сейчас перепроверю.

 
 
 
 Re: GetProcAddress возвращает ноль (NULL) в VС++ 2005 Expr. Ed.
Сообщение11.02.2016, 10:16 
В общем, как-то грузиться… Но текст в начальном сообщении — это не для 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 
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 

(Оффтоп)

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

 
 
 [ Сообщений: 21 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group