Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.25;
Скачать: CL | DM;

Вниз

Не грузится dll, написанная в VC++ ;((   Найти похожие ветки 

 
Th ©   (2002-10-09 17:22) [0]

Помогите, может кто сталкивался. Написал dll-ку на VC++ и пытаюсь сделать LoadLibrary в Delphi. функция возвращает НЕ ноль, а в GetLastError "Неверный дескриптор" и ни функции из dll соответственно не грузятся ;( Может я чего то не то в dll делаю:

#include "stdafx.h"
#include "PortHandle.h"

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}

extern "C"
{
DWORD __declspec(dllexport) OpenPorts(HWND ProcessHWND)
{

// Open access to Port Hole Handler driver
// Returns Port_Handle value of INVALID_HANDLE_VALUE in case of failure
HANDLE Port_Handle;
Port_Handle = CreateFile("\\\\.\\PortHandle",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

// Ask the driver to allow access to the Port hole
// error = 1 means success, 0 means failure
DWORD BytesReturned;
unsigned int err1, err2;
err1 = DeviceIoControl(Port_Handle,
IOCTL_ENABLE_IOPM_ON_PROCESSID,
&ProcessHWND,
4,
NULL,
0,
&BytesReturned,
NULL);

unsigned char tgMask = 0; // Allows IO on all ports within the range of the Hole.
err2 = DeviceIoControl(Port_Handle,
IOCTL_SET_IOPM,
&tgMask,
1,
NULL,
0,
&BytesReturned,
NULL);

CloseHandle(Port_Handle); // Close the Handle to the port in order to stay polite with the system.
return err1 | err2;
}
}



 
Ihor Osov'yak ©   (2002-10-09 19:25) [1]

Попытаюсь ответить. Если мелкие неточности в ответе - не обессудьте - на си уже наверно с пол-года не работал.

Первым делом посмотрите хотя же тем TDump, что ваша dll импортирует. Есть подозрение, что линкер к имени DllEntryPoint чего то подсепил, в стиле ms c++. Как я понимаю, основное предназначение директивы
extern "C" - указание линкеру работать с именами в стиле c, то есть не расширять имена точек входа. А у Вас DllEntryPoint за пределами єтой директивы, следовательно имя этой точки входа будет несколько изменено. Проверте, плиз...

Еще. По умолчанию си строит стек вызова несколько не так, как принято в мире winapi (не говоря уже за делфи). Так что лучше
в декларации OpenPorts добавить __stdcall и соотв. вызов в делфи также обозначить, как stdcall... Но к этой трабле Вы еще не дошли.



Также не нравится юзание #include "stdafx.h" - в нем также с первого взгляда нет необходимости, юзайте напрямую
#include <stdio.h> - ибо stdafx.h много чего лишнего за собой потянуть может. Но это уже дважды имхо ...


В остальном все кажется нормально.

Да, посмотрев на исходный текст я не вижу необходимости писать эту вещь на си - вполне можно было и на делфи. Но это имхо также.





 
Ihor Osov'yak ©   (2002-10-09 19:48) [2]

В дополнение - посмотрел по старым исходникам - там у меня декларации точки входа также несколько иная -

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

Да, и стоит за пределами extern "C". Посмотри по хидерам на APIENTRY..
Ps, свою dll я юзал и с под делфи также .


 
Th ©   (2002-10-10 14:43) [3]

Ihor Osov"yak, во-первых спасибо большое за ответ.

1. Декларации вызова у меня согласованы - всегда и везде использую явно прописанный stdcall.

2. Добавлять DllEntryPoint в extern "C" я уже пробовал - не помогло

3. По поводу обьявления точки входа - я просто использую C++ Builder"вскую, а вы советуете VC++ - разницы между ними нет, я пробовал обе - тоже не помогает.

4. И наконец самое животрепещущее - я конечно пробовал написать эту процедуру в Delphi, но CreateFile в этом случае возвращает -1 и все, может что-то с передачей имени драйвера не то (параметр то строковый) - не знаю. Но в VC++ эта функция работает, а в Delphi нет.

Вот такая драма - Шекспир и племянники ;(( Буду морщить ум дальше. Еще раз спасибо


 
Th ©   (2002-10-10 17:47) [4]

Я РЕШИЛ ПРОБЛЕМУ. Если кому-нибудь интересно, то могу поделиться:
для примера есть драйвер по имени PortHandle, так вот в VC++ он открывается так:
CreateFile("\\\\.\\PortHandle",....);
а в Delphi так:
CreateFile("\\.\PortHandle",....);
\\.\ как я понимаю обозначает, что этот объект есть устройство (драйвер) и искать его нужно в соотв. месте.

А вот если кто-нибудь мне объяснит зачем в C++ надо еще слэшей добавлять, то я ему буду очень благодарен. ;))


 
Suntechnic ©   (2002-10-10 19:31) [5]

Не знаю как в Делфи (я не болшой знаток этой штуки :)), а в C++ есть понятие escape character. Это знак который говорит о том, что следующий за ним символ не является управляющим. Но... любой путь в Windows включает в себя именно этот символ например "С:\Temp". Если в С++ написать строчку подобным образом, то символ "\" будет интерпритирован как escape character и просто будет пропушен. Поэтому надо поставить ещё один escape character для того чтобы проинформировать что следующий символ не является управляющим:"С:\\Temp". Будет просто интерпритирован как "С:\Temp".

В твоём случае надо поставить два бекслэша затем точка и ещё один, что на деле превращается в четыре беслэша точка и ещё два.


 
Bachin ©   (2002-10-10 20:12) [6]

ну раз уже нажал ответить, к тексту
Suntechnic © (10.10.02 19:31)
могу только добавить, что это просто полный путь. точка "." указывает что это локальная машина. можно так писать так:
\\vasya\PortHandle...
конечно же если хватит прав.


 
Th ©   (2002-10-14 17:11) [7]

THanks



Страницы: 1 вся ветка

Текущий архив: 2002.11.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-82962
AlexKniga
2002-11-06 17:36
2002.11.25
Я сдал кадмин!!!


3-82620
Viktor1
2002-11-05 13:43
2002.11.25
Объясните разницу ADO и DAO!!!


3-82649
Oleg-2
2002-11-05 15:04
2002.11.25
Использование баз FoxPro


1-82726
3asys
2002-11-14 10:45
2002.11.25
Как программно работать со средой Delphi?


1-82738
gvb
2002-11-14 19:05
2002.11.25
Как обработать rtf?