COM интрефейсы на СИ

Тема в разделе "WASM.WIN32", создана пользователем slesh, 2 ноя 2010.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Потребовалось один код переписать с С++ на С. Код под Win7.
    на С++ выглядел код так (и работало нормально):
    Код (Text):
    1. ....
    2. IFileOperation *pFileOp = NULL;
    3. BIND_OPTS3 bo = {0};
    4. wchar_t EIFOMoniker[] = L"Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}";
    5. ...
    6. bo.cbStruct = sizeof(bo);
    7. bo.dwClassContext = CLSCTX_LOCAL_SERVER;
    8.  
    9. if (CoGetObject(EIFOMoniker, &bo, __uuidof(IFileOperation), reinterpret_cast< void ** >(&pFileOp)) == S_OK)
    10. ..
    Пытался переписать на Си, вышло вот что:
    Код (Text):
    1. IFileOperationVtbl* pFileOp = NULL;
    2. BIND_OPTS3 bo = {0};
    3. wchar_t EIFOMoniker[] = L"Elevation:Administrator!new:{3ad05575-8857-4850-9277-11b85bdb8e09}";
    4. ...
    5. bo.cbStruct = sizeof(bo);
    6. bo.dwClassContext = CLSCTX_LOCAL_SERVER;
    7.  
    8. if (CoGetObject(EIFOMoniker, (BIND_OPTS*)&bo, &IID_IFileOperation, (void **)&pFileOp) == S_OK)
    Но данный код почему-то не работает. Возвращая статус E_INVALIDARG (0x80070057L)
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    побольше кода не дашь? кто возвращает? CoGetObejct?
     
  3. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    В принципе то кода и нет другова.
    Перед этим кодом выполняется тока CoInitialize(NULL);

    да, именно CoGetObject возвращает.

    Вообще весь это-то код находится в DLL которая внедряется в эксплорер.
     
  4. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Что, решил на шару взять чужой кодес тихого запуска под UAC, и даже лень разобраться с одной ф-цией?))) Не хорошо
     
  5. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    2 onSide не умничай, кодес чужой брать я не собираюсь, а тока технологию копирования файла. причем официально документированную в MSDN. Но необходимо на Си, а не на С++ написать, а с COM ранее практически не работал, по этому и не знаю как.
     
  6. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Тему можно закрыть, сам разобрался уже.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    slesh
    пояснишь в чем была причина?
     
  8. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Вообще сначала пробовал делать в виде шелкода, но был глюк вышеописанный, потом подумал чтобы сделать для отладки в виде DLL и как оказалась ошибка была в том, что вызывал данные функции из DllEntry (DLL_PROCESS_ATTACH), ну и подправил IFileOperation* pFileOp = NULL;

    К томуже баг был в том что при юзанье в виде шелкода забывал GUID копировать вместе с шелкодом