Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2012, 19:25   #1
ZhEKA_
Новичок
Джуниор
 
Регистрация: 24.10.2012
Сообщений: 1
По умолчанию Подключение фортрановской dll к с++ и с#

Добрый день. Передо мной поставлена такая задача. Все решаемые задачи будут математическими, поэтому решил начать с простого примера, в котором дллка будет считать параметр с=а+в.
Рабочие среды:
-visual compaq fortran 6.6
-microsoft visual c# 2008 express edition sp1
-microsoft visual c++ 2008 express edition sp1
Сперва я создаю дллку в фортране, в которой описана подпрограмма, высчитывающая С. Специально для проверки там добавил строчку, которая выводит параметр на экран.
PHP код:
subroutine newdll(a,b,c)
!
DECATTRIBUTES STDCALLALIAS:'newdll' :: newdll
!DECATTRIBUTES DLLEXPORT :: newdll
real a
,b,c
a+b
print *,"c=",c
end subroutine newdll 
Дллка компилится без ошибок.
Далее создаю консольное приложение win32 в с++ и подключаю длл явным методом
PHP код:
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
int _tmain()
{
    
HMODULE  hDll ;
    
hDll LoadLibrary(L"./newdll.dll" ) ;
    if ( 
hDll == NULL )
        {   
// Не нашли DLL
        
cerr << "COULD NOT FIND DLL !" << endl ;
        return 
;
        }
    else 
cerr << "ALL OK !" << endl ;
    
typedef double __stdcall newdllfloat&, float&, float& ) ;
    
newdllpnewdll = (newdll*) GetProcAddresshDll"newdll" ) ; 
    if ( 
pnewdll == NULL ) {   // Не нашли ф-ю
      
cerr << "COULD NOT FIND FUNCTION ENTRY" << endl ;
      return 
;
   }
    else 
cerr << "ALL OK !" << endl ;
float a,b,c;
a=1;b=2;
pnewdll(a,b,c);
cerr << << endl ;
    return 
0;

Запускаю на выполнение. Проект компилится, не выдает ошибок, и выводит на экран значение С такое, как когда переменной еще ничего не присвоено. Но строчку "с=" из дллки выдает на экран.

Аналогичным образом пытаюсь подключить длл в с# (win32 консольное приложение)
PHP код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace 
ca1
{
    class 
Program   
    
{
        [
DllImport("newdll.dll"EntryPoint "newdll")]
        public static 
extern void newdll_(ref double aref double bref double c);
        static 
void Main(string[] args)
        {
            
double a 25c=3;
            
newdll_(ref aref bref c);
            
Console.WriteLine(c);
            
Console.ReadLine();
        }
    }

И также моя программа не считает параметр С.

Т.е. я так понимаю, у меня нет обмена данными между длл и моей программой.
Кто знает, подскажите пожалуйста где я накосячил?

Последний раз редактировалось ZhEKA_; 02.11.2012 в 19:33.
ZhEKA_ вне форума Ответить с цитированием
Старый 02.11.2012, 22:23   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Вы уверены, что Ваша функция на Fortran работает сама по себе? Попробуйте в функции просто вывести a - и удостоверьтесь, что без dll, в обычной Fortran-программе это получается нормально.

Т.е. понятие "нет обмена" явно неверно: адрес функции получен, ей передано управление, она вызвалась. Соглашения о вызовах (вроде бы) совпадают. Вторая гипотеза - удостовериться, что real в Fortran и float в C++ - это один и тот же тип.

Последний раз редактировалось Abstraction; 02.11.2012 в 22:25.
Abstraction вне форума Ответить с цитированием
Старый 02.11.2012, 23:30   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

1. В ФОРТРАНе убрать вторую строку:
Код:
!DEC$ ATTRIBUTES STDCALL, ALIAS:'newdll' :: newdll
2. В C++ в
Код:
newdll* pnewdll = (newdll*) GetProcAddress( hDll, "newdll" ) ;
записать имя разыскиваемой ф-ии ЗАГЛАВНЫМИ БУКВАМИ:
Код:
newdll* pnewdll = (newdll*) GetProcAddress( hDll, "NEWDLL" ) ;
В до-диезе ничего никогда не играл, сорри.
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение DLL на С++ mrbadge Общие вопросы Delphi 1 03.10.2012 23:13
подключение DLL Lui C# (си шарп) 5 14.01.2012 13:05
Подключение DLL Ninetta Общие вопросы .NET 3 01.04.2010 01:06
Подключение DLL __Demon__ C++ Builder 2 09.12.2009 00:29
Подключение DLL 5naip Помощь студентам 9 27.10.2007 20:55