Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Передача строки в процедуру


Автор: Yak 5.11.2005, 22:39
Короче такая хрень получается - из библиотеки "NtDll_call.dll" (написанной в VC++) в процедуру "lpproc" программы, написанной на VB6.0 передается строка "strTxt". Строка обьявляется как
Код
 CHAR strTxt = (pProcesses->ProcessName.Buffer); 

и содержит имя текущего процесса. Так вот при попытке передать ее в процедуру VB6.0 таким образом:
Код
pfnEnumProc(strTxt, pProcesses->ProcessId, lParam, WParam);

сам VB просто падает при обращении к этой(pszProcessName) переменной с хз какой ошибкой, а если передать эту строку так:
Код
pfnEnumProc(&strTxt, pProcesses->ProcessId, lParam, WParam);

в процедуру VB уходит какой то набор символов.

Процедура в VB:
Код
Function lpproc(ByVal [b]pszProcessName[/b] As String, ByVal dwProcessId As Long, ByVal lParam As Long, ByVal WParam As Long) As Long

и так она обьявлена в библиотеке VC++
Код
typedef BOOL (CALLBACK * PFNENUMPROC)(IN CHAR pszProcess, IN DWORD dwProcessId, IN LPARAM lParam, IN USHORT WParam);

самое интересное, что если обьявить эту строку не как CHAR, а как другой текстовый тип, то в VB не приходит пустая строка, хотя из VC++ эту строку видно как надо.

P.S. Если кто нить понял, что я тут нагородил)))))), то скажите где у мя здесь ошибка? И какой текстовой тип VC++ передастся без проблем в VB String?

P.P.S. Не надо ща советовать "пиши все на VC++ и не парься"... Просто в VB мне гораздо проще и быстрее составлять внешний вид программы, а на VC++ - исполняемые модули, где много коду...

Автор: np9mi7 6.11.2005, 19:24
Что ты хочешь сделать? Опиши откуда, что вызывать собрался... А то ничего не понятно...

Автор: maxim1000 6.11.2005, 19:40
Цитата
CHAR strTxt

это опечатка?
если нет, то char в C++ обозначает символ и ничего больше
строка, обычно, представляется указателем на char:
char*

Автор: Yak 6.11.2005, 21:41
Если покороче сказать (нашел как это называется))))), то не знаю как передать значение как например в станд ф-ции GetWindowText(), т. е. как буфер, чтоб туда передаешь пустую строку, а она возвр строку с именем процесса. А вот как эт реализовать?

Автор: maxim1000 6.11.2005, 22:15
просто выделить буфер нужного размера (объявлением массива или с помощью new) и дальше передавать этот указатель куда надо

Автор: np9mi7 6.11.2005, 22:49
Цитата
int GetWindowText(     

    HWND hWnd,
    LPTSTR lpString,
    int nMaxCount
);


Цитата
lpString
    [out] Pointer to the buffer that will receive the text. If the string is as long or longer than the buffer, the string is truncated and terminated with a NULL character.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/getwindowtext.asp

lpString - это нуль терминированная строка. Как написал maxim1000 делаешь так:
Код

std::vector <char> vcWindowsText (256);            /// буфер под строку
GetWindowText (/*Windows Handle*/, 
    &vcWindowsText.front (), vcWindowsText.size ());/// получение текста с окна

Автор: maxim1000 7.11.2005, 02:07
я бы не стал использовать здесь std::vector
дело в том, что (если я не ошибаюсь) стандарт не гарантирует, что элементы вектора будут храниться последовательно
да, пожалуй, это наиболее логичный способ его реализовывать, но не стоит гадать, как производитель STL это сделал
мне кажется, что лучше все-таки на этом уровне использовать char s[256]
а потом приводить его к std::vector, если надо...

Автор: srd 7.11.2005, 04:05
Цитата(maxim1000 @ 7.11.2005, 09:07)
я бы не стал использовать здесь std::vector
дело в том, что (если я не ошибаюсь) стандарт не гарантирует, что элементы вектора будут храниться последовательно

В отличие от std::string, для вектора гарантируется стандартом последовательное расположение элементов в памяти.

Автор: maxim1000 7.11.2005, 14:52
Цитата
В отличие от std::string, для вектора гарантируется стандартом последовательное расположение элементов в памяти

упс... значит, ошибся...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)