Форум: "WinAPI";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизНе грузится 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c