Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Dll на VC++ и прога на Delphi, и ещё немного win api 
:(
    Опции темы
Ptica_Oz
Дата 14.3.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



есть длл на VC++. в правильности работы ф-ций я уверена (в виде ехе-ника они работали замечательно).подключаю ее к проге на делфи и прога запинаестя на winapi-ной ф-ции.

код длл:
Код

static DEVMODE  *pDevmode    = 0;
static const TCHAR    *PrinterName = 0;
boolean __stdcall ACADPrint(char *Path,
                        char * Color,
                        char * Printer,
                        char * Text,
                        int Scale)
{
    ...
    PrinterName = (TCHAR *)Printer;
         ...
         pDevmode = fetch_DEVMODE(hPrinter, PrinterName);
         ...
         if ( pDevmode )
    {
        free(pDevmode);
        pDevmode = 0;
    }
}
...
static DEVMODE *fetch_DEVMODE(HANDLE hPrinter, const TCHAR *pname)
{
DEVMODE    *pdm = 0;
    
    LONG n = DocumentProperties( 0,    // hWnd
        hPrinter,
        const_cast<TCHAR *>(pname),
        0,            // DEVMODE output
        0,            // DEVMODE input
        0 );            // mode
    
    DocumentProperties( 0,        // hWnd
        hPrinter,
        const_cast<TCHAR *>(pname),
        pdm,                // DEVMODE output
        0,                // DEVMODE Input
        DM_OUT_BUFFER )    // mode
    

    return pdm;
}


код проги на дефи:
Код

var
   path, Color, Printer : PChar;
   Scale : integer;
...
   f := ACADPrint(path, Color, Printer, '!!!', Scale);

вылетаю на первом вызове ф-ции DocumentProperties.
обращалась к спецам по делфе на этом форуме. они посоветовали в длл передавать PChar, что собственно я и делаю. но результата это не дало.
помогите разобраться...  smile 
PM MAIL   Вверх
_hunter
Дата 14.3.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



во-первых: делфийского кода маловато.
во-вторых: что мешает код отладить и найти ошибку?
в-третьих: не в тот раздел вопрос...

Добавлено @ 13:31 
unicode, кстати, часом не продефайнен?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ptica_Oz
Дата 14.3.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
во-первых: делфийского кода маловато.

а больше там ничего интересного нет. маленькая формачка с которой считываются значения переменных, как надо преобразуются, и вызывается та самая единственная и не повторимая ф-ция длл-ки
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
во-вторых: что мешает код отладить и найти ошибку?

как?
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
в-третьих: не в тот раздел вопрос...

если считаете нужным переместите
PM MAIL   Вверх
_hunter
Дата 14.3.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



Цитата(Ptica_Oz @  14.3.2007,  13:37 Найти цитируемый пост)
а больше там ничего интересного нет

т.е. переменные не инициализируются?
Цитата(Ptica_Oz @  14.3.2007,  13:37 Найти цитируемый пост)
как?

открываем проект .dll-ки в студди; жмем F5; указываем путь к .exe-шнику


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
ama_kid
Дата 14.3.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Цитата(Ptica_Oz @ 14.3.2007,  13:37)
а больше там ничего интересного нет.

Это вам кажется, что ничего интересного нет. Мне, к примеру, было бы интересно посмотреть, как происходит загрузка библиотеки (статически или динамически), как происходит получение адреса функции (через GetProcAddress или дефинишеном напрямую), какие в итоге значения получаются и многое другое....
Цитата
Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
во-вторых: что мешает код отладить и найти ошибку?

как?

Обычным способом. Загрузить среду, где разрабатывалась Dll-ка, загрузить проект Dll и запустить его на отладку с указанием host-приложения, которое эту библиотеку будет подгружать (в данном случае - ваше приложение)...


Это сообщение отредактировал(а) ama_kid - 14.3.2007, 13:59


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Ptica_Oz
Дата 14.3.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Цитата(ama_kid @  14.3.2007,  13:58 Найти цитируемый пост)
 Мне, к примеру, было бы интересно посмотреть, как происходит загрузка библиотеки (статически или динамически), как происходит получение адреса функции (через GetProcAddress или дефинишеном напрямую), какие в итоге значения получаются и многое другое....

ох, простите,  про это-то я и забыла...
Код

function ACADPrint (Path : PChar;
                            Color : PChar;
                            Printer : PChar;
                            Text : PChar;
                            Scale : Integer) : Boolean ;stdcall; external 'D:\TextStyle.dll';



а с отладкой ща попробую...
PM MAIL   Вверх
Любитель
Дата 14.3.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Ptica_Oz, значения всех параметров какие? Откуда берутся?


--------------------
PM MAIL ICQ Skype   Вверх
Ptica_Oz
Дата 14.3.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Любитель,  в делфях они берутся из формы и переводятся в тип PChar кроме одного, который имеет тип integer. в длл параметры типа char * и int.  или я не про то говорю?  smile 

Это сообщение отредактировал(а) Ptica_Oz - 14.3.2007, 15:37
PM MAIL   Вверх
Ptica_Oz
Дата 14.3.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



при отладке говорит:
Код

Unhandled exception at 0x1001fdbb in Loodsman.exe: 0xC0000005: Access violation reading location 0x1001fdbb.

PM MAIL   Вверх
Любитель
Дата 14.3.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(_hunter @  14.3.2007,  13:27 Найти цитируемый пост)
unicode, кстати, часом не продефайнен?

Кстати да. В студии анси или уникод?


--------------------
PM MAIL ICQ Skype   Вверх
_hunter
Дата 14.3.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



это в какой момент говорит? в функцию попадаеш?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ptica_Oz
Дата 15.3.2007, 06:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Цитата(_hunter @  14.3.2007,  16:55 Найти цитируемый пост)
это в какой момент говорит? в функцию попадаеш?

говорит когда первый раз пытаюсь выполнить DocumentProperties (т.е. в ф-цию fetch_DEVMODE попадаю)
в студии анси

Это сообщение отредактировал(а) Ptica_Oz - 15.3.2007, 06:59
PM MAIL   Вверх
dumb
Дата 15.3.2007, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Ptica_Oz,
так как падает на вызове, в который передается единственный("левый" хэндл обычно не приводит к падениям) параметр - имя, то, видимо, дело именно в уникодной сборке dll и твоих ловких приведениях типов -
Код

                        char * Printer,
...
    PrinterName = (TCHAR *)Printer;


Цитата(Ptica_Oz @  15.3.2007,  06:53 Найти цитируемый пост)
в студии анси

если в проекте dll анси-строки, то это уже мистика какая-то... возможно, для прояснения ситуации тебе будет проще выложить exe+dll где-нибудь?
PM MAIL   Вверх
_hunter
Дата 15.3.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



в чем проблема легко проверить: вместо "const_cast<TCHAR *>(pname)" пишем имя принтера и пробуем вызвать так.
зачем, кстати, передавать TCHAR*, если приходит char*? зачем передавать const TCHAR*, если потом идет каст к TCHAR*?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Ptica_Oz
Дата 15.3.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



Цитата(_hunter @  15.3.2007,  11:54 Найти цитируемый пост)
в чем проблема легко проверить: вместо "const_cast<TCHAR *>(pname)" пишем имя принтера и пробуем вызвать так.зачем, кстати, передавать TCHAR*, если приходит char*? зачем передавать const TCHAR*, если потом идет каст к TCHAR*?

честно говоря этот вызов я взяла из чужого кода и сильно не разбиралась (работало в ехе и ладно), потом пробовала шаманить с "const_cast<TCHAR *>(pname)" ничего не получилось. просто писать имя не пробовала, но попытаюсь...
сейчас решила пойти в обход: сделала вместо длл ехе и вызываю его с параметрами из делфей через CreateProcess. ща олаживаю, попозже напишу чем дело кончилось.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1018 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.