Текущий архив: 2010.03.14;
Скачать: CL | DM;
Вниз
Помогите найти описание StringCchPrintf Найти похожие ветки
← →
Дмитрий (2009-04-12 16:56) [0]Приветствую! Прошу помочь мне найти описание данной функции под делфи. Всё перерыл, есть только прототип на Си из MSDN. На паскаль перевести ума не хватает :(
HRESULT StringCchPrintf(
LPTSTR pzsDest
size_t cchDest
LPCTSTR pzsFormat
...
);
← →
Игорь Шевченко © (2009-04-12 17:04) [1]format :)
← →
Дмитрий (2009-04-12 17:36) [2]Смотрите - в MSDN код:
// This TOM implementation code is executed when a new windowed
// instance starts up.
// Variables with leading underscores are members of this class.
HRESULT hr;
OLECHAR szBuf[10]; // Place to put moniker
MONIKER *pmk;
hr = StringCchPrintf(szBuff, 10, "%x", _hwnd);
if (FAILED(hr))
{
//
// TODO: write error handler
//
}
CreateFileMoniker(szBuf, &pmk);
OleStdRegisterAsRunning(this, pmk, &_dwROTcookie);
Разве в этом случае я могу использовать обычный формат? StringCchPrintf вроде как безопаснее, насколько я знаю...
← →
Palladin © (2009-04-12 18:33) [3]
> StringCchPrintf вроде как безопаснее, насколько я знаю..
> .
Расскажи на сколько безопасней и я расскажу насколько ты знаешь :)
← →
Дмитрий (2009-04-13 10:16) [4]:) Хорошо, тогда вопрос в другой проекции - как перевести вышеуказанный код на делфи, используя функцию формат?
Был бы очень благодарен за любую помощь. Нужно позарез получить TOM работающего чужого приложения...
← →
Дмитрий (2009-04-13 10:27) [5]Кажется, стормозил :) вопрос снят
← →
Игорь Шевченко © (2009-04-13 12:42) [6]Дмитрий (13.04.09 10:27) [5]
Можно долго и мучительно писать прототип для сабжевой функции, используя модификаторы cdecl и varargs, а можно по вспомнить, что для использования Format нужно слегка изменить способ вызова и вместо перечисления дополнительных аргументов сразу за обязательными, просто взять их в квадратные скобки :)
← →
Дмитрий (2009-04-13 16:37) [7]Спасибо, понял сам, что дурак :) А вот ещё вопрос, хоть я наверное и задолбал уже. Есть код:
// Accessibility Client:
// Find hwnd for window pointed to by mouse cursor.
GetCursorPos(&pt);
hwnd = WindowFromPoint(pt);
// Look in ROT (running object table) for an object attached to hwnd
hr = StringCchPrintf(szBuff, 10, "%x", hwnd);
if (FAILED(hr))
{
//
// TODO: write error handler
//
}
CreateFileMoniker(szBuf, &pmk);
CreateBindContext(0, &pbc);
pmk->BindToObject(pbc, NULL, IID_ITextDocument, &pDoc);
pbc->Release();
if( pDoc )
{
pDoc->RangeFromPoint(pt.x, pt.y, &pRange);
// ...now do whatever with the range pRange
}
Пытаюсь адаптировать под делфи. Сразу же остановился на CreateBindContext. Поискал во всех файлах - нету такого в поставке D7 :( Где взять?
← →
Игорь Шевченко © (2009-04-13 17:15) [8]
> Сразу же остановился на CreateBindContext. Поискал во всех
> файлах - нету такого в поставке D7
Надо искать CreateBindCtx - сразу найдется.
← →
Дмитрий (2009-04-13 18:46) [9]Пасиб, нашёл
← →
Дмитрий (2009-04-14 09:55) [10]Снова я. Снова проблема :) Пишу так (hRich - хендл чужого richedit):
var
buf: WideString;
pmk: IMoniker;
pbc: IBindCtx;
TextDocument: ITextDocument;
R: HRESULT;
begin
pbc := nil;
pmk := nil;
TextDocument := nil;
buf := Format("%x", [Int2Str(hRich)]);
CreateFileMoniker(PWideChar(buf), pmk);
CreateBindCtx(0, pbc);
R := pmk.BindToObject(pbc, nil, IID_ITextDocument, TextDocument);
case R...
if TextDocument = nil then ShowMessage("Bingo :(");
end;
TextDocument всегда равен нулю. Что в этом коде неправильно?
← →
Дмитрий (2009-04-16 15:31) [11]Извините за настойчивость, но я пытаюсь вернуть тему к жизни :)
Кто-нибудь может посмотреть код и сказать, что неправильно? Я сам решить проблему не смог.
Может, выложить маленький тестовый исходник, чтобы вам было проще?
← →
clickmaker © (2009-04-16 15:55) [12]R чему равен?
← →
Дмитрий (2009-04-16 16:45) [13]Щас скажу фигню, R равен -2147221008. В MSDN не указаны иные значения, кроме S_OK, поэтому именованных констант привести не могу :(
← →
clickmaker © (2009-04-16 17:11) [14]> R равен -2147221008
это CO_E_NOTINITIALIZED - CoInitialize has not been called.
← →
Дмитрий (2009-04-16 19:09) [15]Инициализировал. Теперь другое значение - -2147221014... :( Что это?
← →
Дмитрий (2009-04-16 19:23) [16]CoInitialize не возвращает S_OK.
← →
Игорь Шевченко © (2009-04-16 19:30) [17]А чего в итоге надо-то ?
← →
Дмитрий (2009-04-17 10:37) [18]В итоге хочу получить ITextDocument запущенного экземпляра TOM. Дело в том, что получить этот интерфейс у своего приложения не составляет труда (GETOLEINTERFACE), а вот в случае с чужим richedit нужны костыли, пример которых приведён в MSDN. Но если делать как в MSDN"е пишут, то не работает. Почему - не знаю. Пока что подозрения на неправильное преобразование строки вот тут:
buf := Format("%x", [IntToStr(hRich)]);
Может кто-нибудь сказать, соответствует ли оно мсдновскому
hr = StringCchPrintf(szBuff, 10, "%x", _hwnd);
?
← →
Игорь Шевченко © (2009-04-17 11:02) [19]
> buf := Format("%x", [IntToStr(hRich)]);
buf := Format("%x", [hRich]);
> В итоге хочу получить ITextDocument запущенного экземпляра
> TOM
Че ?
← →
Дмитрий (2009-04-17 12:12) [20]Вот минимальный исходник(http://webfile.ru/3420050). Прошу потестировать. Запускаете WordPad и наводите мышку на него, должен вернуться хендл Rich Edit. Далее, жмёте кнопку. У меня успешно отрабатывают все функции, кроме CreateBindCtx...
> Че ?
Возможно, мой английский действительно очень плох )) MSDN говорит:
...TOM instance with a window needs to register in the ROT...
← →
clickmaker © (2009-04-17 13:57) [21]> -2147221014... :( Что это?
http://social.msdn.microsoft.com/Search/en-US/?query=MK_E_CANTOPENFILE&ac=3
← →
Дмитрий (2009-04-17 21:36) [22]Ага.. И что бы это значило? Есть идеи?
Страницы: 1 вся ветка
Текущий архив: 2010.03.14;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.015 c