Проблема - TCHAR как LPARAM для окна, которое принадлежит другому процессу / потоку - PullRequest
1 голос
/ 04 января 2011

Так что я играю / внедряю с окнами через c книги примеры, и есть кое-что в части внедрения dll, которая поражает меня, и я не могу решить это.

Я создал диалог, который принадлежит другому потоку / процессу, и я пытаюсь отправить ему переменную TCHAR, чтобы он мог затем использовать эту переменную в некоторой функции (и функция, и tchar находятся в одном файле DLL)

Поэтому, когда диалог создается и хорошо сидит в другой ветке, я отправляю ему сообщение.

Сначала я объявляю tchar

TCHAR finalpath[MAX_PATH];

Тогда позже я просто заполняю его информацией (я делаю это в потоке dll, а не в потоке диалога, позвольте мне также упомянуть, что я должен сделать это в потоке dll, потому что это единственный способ заполнить требуемый tchar (i требуется получить рабочий каталог dll и заполнить его в tchar))

Итак, когда я получаю эту информацию в моем tchar, я пытаюсь отправить сообщение в диалог и использовать tchar в качестве LPARAM (wparam is hwnd btw)

SendMessage(hWndDIPS, WM_APP, (WPARAM) lista, (LPARAM)finalpath); 

После этого я делаю основную школьную работу в другом цикле процедуры диалога потоков ...

INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

   switch (uMsg) {
      chHANDLE_DLGMSG(hWnd, WM_CLOSE, Dlg_OnClose);

      case WM_APP:


  SaveListViewItemPositions((HWND) wParam, (TCHAR)lParam);
         break;
   }

   return(FALSE);
}

Функция, которая должна принимать параметр (эта функция находится в разделяемой dll и вызывается процедурой, как вы видите выше, определяется следующим образом.

void SaveListViewItemPositions (HWND hWndLV, TCHAR sejv []) { ...}

Ошибка компилятора, которую я получаю, это

Error 7 error C2664: 'SaveListViewItemPositions' : cannot convert parameter 2 from 'TCHAR' to 'TCHAR []'

Так что я понятия не имею, почему это происходит. Если tchar - это массив, тогда мне нужно использовать его в параметрах с добавленным [], так как это то, как массивы используются в параметрах (не говоря уже о том, что если я этого не сделаю, это даст мне больше ошибок, и я все равно не смогу использовать параметр в функции)

Так почему же тогда он не конвертирует?

Если есть другое решение для создания этого диалога для получения переменной tchar, пожалуйста, объясните.

Спасибо

Ответы [ 2 ]

5 голосов
/ 04 января 2011

Даже после того, как вы исправите объявления типов и правильно приведете LPARAM к TCHAR*, ваш код будет неверным. «Параметр», который вы передаете этой оконной процедуре, является указателем, и, как и любой указатель, действителен только в адресном пространстве процесса. Окно получателя должно будет использовать ReadProcessMemory и скопировать строку из вашего процесса в его собственный процесс. Конечно, это означает, что процесс-получатель знает ваш идентификатор процесса и имеет надлежащие привилегии для чтения из вашей памяти. И вам также нужно передать длину строки, поскольку ReadProcessMemory не может угадать, где находится терминатор NULL (хотя я считаю, что с максимальной длиной MAX_PATH это не является серьезной проблемой).

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

Существует несколько механизмов IPC, которые вы можете использовать. Самый простой - это анонимный именованный канал, см. Операции с анонимным каналом . Общая память - это другое, см. Использование общей памяти в библиотеке Dynamic-Link . COM также будет работать (пусть процесс, которым вы «управляете») создаст экземпляр класса, который размещен на вашем сервере процессов, и пусть COM-маршалинг сделает все остальное, см. Сведения о маршалинге ). Или вы можете вручную подключить интерфейс COM между границей процесса (см. CoMarshalInterface).

1 голос
/ 04 января 2011

Я думаю, что ваша проблема в том, что вы типизируете LPARAM в TCHAR вместо массива TCHAR (TCHAR *). Попробуйте изменить это и посмотреть, исправит ли это что-то.

...