WASAPI: CoCreateInstance nem ad interfészt

WASAPI: CoCreateInstance nem ad interfészt
2014-01-20T22:53:45+01:00
2014-01-21T21:45:52+01:00
2022-11-30T09:55:44+01:00
zoltánka
Win8-ban készülök WASAPI-t használni.
Az itt levő példa szerint tervezek hangfelvételt.
Az Ole32.dll-ben hívom meg a CoCreateInstance függvényt.
A példa szerint a függvény 1. és 4. paramétere egy MMDeviceEnumerator nevű GUID. Ennek utánanéztem. Ezek a GUID-ok 16 byte-os konstansok. Konkrétan ez így van írva több helyen:

BCDE0395-E52F-467C-8E3D-C4579291692E
Már foglalkoztam ilyenekkel. Tudom, hogy a bájtok milyen sorrendben vannak.

95 03 DE BC 2F E5 7C 46 8E 3D C4 57 92 91 69 2E
Egyszerűen egy pointert adok át assembly-ben, ami a tömbre mutat. Csináltam már a DirectInput-nál 32 biten.
A 2. paraméter NULL.
A 3. paraméter CLSCTX_ALL négy konstans összege, közvetlenül megadom: 17h.
Az 5. paraméter a kimeneti pointer, ahova várom az interfészt. De nullát ad. A return value pedig 800401F0 azaz CoIntialize has not been called.
Mi lehet a hiba?
Mutasd a teljes hozzászólást!
Tovabbi nem teljesen kerek dolgok, most, hogy Istvan up-olta:
- a 4. parameter szinten egy guid:
IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
(a masik szerintem stimmel) CLSID_MMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
- jó a guid byte-sorrend, de nem kell a vegere a #0, mert a guid az nem egy string, hanem egy 16byte-os struct.
- az interface ptr-t (amire a rámutató ptr-t megadod) ne felejtsd el kinullazni, mert ellenkezo esedben a cocreate fog a rajta levo memoriaszémeten accessviolazni)
- Ez csak furcsasag, hogy az en CLSCTX_ALL definiciomban nincs benne a  REMOTE
Mutasd a teljes hozzászólást!

  • Ez a hiba -> CoIntialize has not been called.

    Legeloszor meg kell hivnod a CoInitializeEx()-t (0, 0 mehet a parametereknek). Csak azutan hasznalhatsz barmit, ami COM.
    Mutasd a teljes hozzászólást!
  • Valahogy így néz ki a GUID string:

    REFCLSID rclsid rclsid stringé átalakítása, ha van benne bináris érték: sprintf_s(GUIDString,64, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\0", rclsid.Data1, rclsid.Data2, rclsid.Data3, rclsid.Data4[0], rclsid.Data4[1], rclsid.Data4[2], rclsid.Data4[3], rclsid.Data4[4], rclsid.Data4[5], rclsid.Data4[6], rclsid.Data4[7]);

    axhelper meg tudod nézni a gépen futó összes program CLSID-t.
    Win7 működik, Win8 nem próbáltam.
    Mutasd a teljes hozzászólást!
  • Tovabbi nem teljesen kerek dolgok, most, hogy Istvan up-olta:
    - a 4. parameter szinten egy guid:
    IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
    (a masik szerintem stimmel) CLSID_MMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
    - jó a guid byte-sorrend, de nem kell a vegere a #0, mert a guid az nem egy string, hanem egy 16byte-os struct.
    - az interface ptr-t (amire a rámutató ptr-t megadod) ne felejtsd el kinullazni, mert ellenkezo esedben a cocreate fog a rajta levo memoriaszémeten accessviolazni)
    - Ez csak furcsasag, hogy az en CLSCTX_ALL definiciomban nincs benne a  REMOTE
    Mutasd a teljes hozzászólást!
  • A CoInitializeEx-et azért hagytam ki, mert nem volt a példában. Igaz, hogy a hibakód árulkodott, hogy CoIntialize has not been called, de nem azt értettem alatta, hogy nekem kell meghívnom, hanem olyasmit, hogy a függvénynek kellene, de a pl. rossz paraméterek miatt nem hívta meg.
    Miután beírtam a függvényhívást, a köv. hibakód 80040154 volt, azaz Class not registered. Aztán észrevettem, amit írtál, hogy a 4. paraméter nem jó. Azért adtam ugyanazt, mint az elsőben mert:

    __uuidof(MMDeviceEnumerator) __uuidof(IMMDeviceEnumerator)
    összekevertem.
    Most már jó. Kiadta az interfészt. Ha meg valamelyik további függvénynél elakadok, akkor még kérdezek.
    Mutasd a teljes hozzászólást!
  • Hat en fel eve sz..tam vele, mert ugyan talaltam Delphi-s headereket hozzá, de sehogy sem akart menni, aztan kiderult, hogy tele volt hibaval a header, mert valaki portolta, de még nem tesztelte (pl. volt olyan lelkes, hogy az interface definiciokban nehol abc szerint rendezte a metodusokat, holott ott az index szamit, nem a nev). Szoval opensource my ass... Egy VS-cpp-t viszont megerte felrakni, mert az MSDN-es peldak jol mukodtek. Vegul bejott a WASAPI, mert feleannyi lett a playback latency mint XP+DSound-on (5ms-et lazan megbir). Az persze csunya dolog volt, hogy Win7-en a DSound latency-je meg felment 100ms-re.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd