Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача строкового параметра в dll 
:(
    Опции темы
Incinerated
Дата 3.5.2008, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 18.5.2006
Где: Беларусь, Новопол оцк

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



Есть приложение, и есть dll, которая используется в приложении. Библиотека используется для hook'a, т.е.:
Код

      typedef VOID (*MYPROC)(LPCSTR);
      MYPROC ProcAdd;
      FARPROC myproc1,myproc2;
      hMyDll=LoadLibrary("MyDLL");
      
      ProcAdd = (MYPROC) GetProcAddress(hMyDll,"GetWindowName");
      if (NULL != ProcAdd) {
        HWND hwnd = GetForegroundWindow();
        char tmp[100];
        int length = GetWindowText(hwnd,tmp,100);
        char *send = new char[length];
        strcpy(send,tmp);
        (ProcAdd) (send);
      }

      (void *)myproc1 =  GetProcAddress(hMyDll,"MyFunction1");
      (void *)myproc2 =  GetProcAddress(hMyDll,"MyFunction2");

      myhook1 = SetWindowsHookEx(WH_CBT,(HOOKPROC)(myproc1),hMyDll,0);
      myhook2 = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)(myproc2),hMy


но есть функция "GetWindowName". Смысл ее в том, что мне нужно в dll передать заголовок, теущего окна, с которым работает пользователь, но как я понимаю просто так передать ее нельзя, т.к. для каждого приложения код dll будет свой, и переменные будут свои.
Вот код dll:
Код

#include <windows.h>
#include <vcl.h>
String ApplicationName; 
#pragma argsused
extern "C" __declspec (dllexport) LRESULT CALLBACK GetWindowName(LPCSTR tmp){
ApplicationName = tmp;
 return 0;
}

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
  return 1;
}
extern "C" __declspec (dllexport) LRESULT CALLBACK MyFunction2(int nCode,WPARAM wParam,LPARAM lParam)
{
...
}
extern "C" __declspec (dllexport) LRESULT CALLBACK MyFunction1(int nCode,WPARAM wParam,LPARAM lParam)
{
...
  if ((nCode == HCBT_MINMAX) && (lParam == SW_RESTORE)){
    ShowMessage(ApplicationName);  
  }
}

В функцию GetWindowName все передается, а ShowWindow показывает пустую строку. Есть идеи по поводу?
PM MAIL   Вверх
T0ohtik
Дата 3.5.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Тоесть GetWindowName находится в dll и тебе надо её вызвать и передать туда параметр - имя окна?
PM MAIL   Вверх
T0ohtik
Дата 3.5.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если да, то это можно сделать при помощи динамического связываения:
в главной программе пишешь
Код

typedef BOOL (WINAPI *PGETWINDOWNAME )(LPTSTR);
HANDLE hLib = LoadLibrary("MyDll.dll");
if(hLib)
{
     PGETWINDOWNAME pGetWindowName;
     pGetWindowName = (PGETWINDOWNAME)GetProcAddress(hLib, "GetWindowName")
     if(pGetWindowName) 
     {
           pGetWindowName("Заголовок_окна") ;
           free(hLib); 
     }
}

PM MAIL   Вверх
586
Дата 3.5.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(T0ohtik @  3.5.2008,  13:46 Найти цитируемый пост)
HANDLE hLib = LoadLibrary("MyDll.dll");
if(hLib)
{
     PGETWINDOWNAME pGetWindowName;
     pGetWindowName = (PGETWINDOWNAME)GetProcAddress(hLib, "GetWindowName")
     if(pGetWindowName) 
     {
           pGetWindowName("Заголовок_окна") ;
           free(hLib);
     }
     FreeLibrary(hLib);
}

Неправильно. Нужно вызывать FreeLibrary.
PM   Вверх
T0ohtik
Дата 3.5.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



586,  упс, просто очепятался...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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