Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-82728
poljana
2002-11-14 23:06
2002.11.25
вещю числа


1-82826
Vovaka
2002-11-13 16:48
2002.11.25
Как определить, что с приложением никто не работает


3-82653
Youri
2002-11-06 11:56
2002.11.25
Поиск в базе!


8-82874
dimushkin
2002-07-26 14:16
2002.11.25
Вопрос про DirectDraw ..


14-82946
Dmitriy Polskoy
2002-11-04 18:59
2002.11.25
Win 2000 Advanced Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский