COM中获取JavaScript数组大小的代码_javascript技巧
IDispatch类型的指针,则表明该数组对象实际是一个JavaScript的内建数组对象,在JavaScript端,我们可以通过length属性来得到数组的大小,那么在此处,可以通过GetIDsOfNames函数和Invoke函数来获取数组长度,这样可以动态变量数组内容。
// 获取数组长度
BSTR bstrLength = L"length";
DISPID dispid;
hr = lpDispatch->GetIDsOfNames(IID_NULL, &bstrLength, 1,
LOCALE_USER_DEFAULT, &dispid);
if ( SUCCEEDED(hr) )
{
CComVariant varResult;
hr = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &noArgs, &varResult, NULL, NULL);
if ( varResult.vt == VT_I4)
{
nLength = varResult.intVal;
}
}
这个时候,nLength获得得到的就是数组的长度。
在JavaScript中的数组时一个对象,数组内容则是该对象的属性,是动态被创建的,这些属性的查询方式与length的查询方式有些类似,也是GetIDsOfNames和Invoke函数,主要差别在于名字的区别,数组中元素对象的属性,其名字是动态创建,也就是可以通过下标方式方式获取,因此,在此处,也可以通过下标方式获取该属性名称,具体如下:
for ( int i=0; i
CComVariant vaIndex(i, VT_I4);
vaIndex.ChangeType(VT_BSTR);
DISPID dispid;
hr = lpDispatch->GetIDsOfNames(IID_NULL, &vaIndex.bstrVal,1,
LOCALE_USER_DEFAULT, &dispid);
if ( FAILED(hr) )
{
continue;
}
CComVariant varResult;
hr = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_PROPERTYGET, &noArgs, &varResult, NULL, NULL);
VARTYPE vt = varResult.vt;
if (vt == VT_DISPATCH )
{
InvokeArray( varResult );
continue;
}
hr = varResult.ChangeType(VT_BSTR);
CComBSTR bstrVal = varResult.bstrVal;
}
于是通过这两种属性方式的调用,就可以在COM接口中便利所有的JavaScript数组对象了。
这个有什么好处呢,在查看很多网上资源的时候,发现大部分采用SAFEARRAY方式对结构体进行处理,传入到COM接口中,但SAFEARRAY在MIDL中并不被支持,而且JavaScript对象本身也不支持这个内容,要对SAFEARRAY方式操作,需要切换VBScript和JavaScript两种语言,这会导致程序编写的困难和维护人员的困惑。
直接采用JavaScript方式传入数组,对数组任意方式进行整合,就不需要通过SAFEARRAY方式进行结构体整合。同时,由于JavaScript中的每一个对象(元素)都带有本身的类型信息,因此,JavaScript中的数组时C中结构体的最佳替代方式(传递方式)。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Kaedah menggunakan gelung foreach untuk mengalih keluar elemen pendua daripada tatasusunan PHP adalah seperti berikut: melintasi tatasusunan, dan jika elemen itu sudah wujud dan kedudukan semasa bukan kejadian pertama, padamkannya. Contohnya, jika terdapat rekod pendua dalam hasil pertanyaan pangkalan data, anda boleh menggunakan kaedah ini untuk mengalih keluarnya dan mendapatkan hasil tanpa rekod pendua.

Kaedah untuk tatasusunan penyalinan dalam dalam PHP termasuk: Pengekodan dan penyahkodan JSON menggunakan json_decode dan json_encode. Gunakan peta_tatasusunan dan klon untuk membuat salinan kunci dan nilai yang mendalam. Gunakan bersiri dan menyahsiri untuk bersiri dan menyahsiri.

Perbandingan prestasi kaedah membalik nilai kunci tatasusunan PHP menunjukkan bahawa fungsi array_flip() berprestasi lebih baik daripada gelung for dalam tatasusunan besar (lebih daripada 1 juta elemen) dan mengambil masa yang lebih singkat. Kaedah gelung untuk membalikkan nilai kunci secara manual mengambil masa yang agak lama.

Fungsi array_group_by PHP boleh mengumpulkan elemen dalam tatasusunan berdasarkan kekunci atau fungsi penutupan, mengembalikan tatasusunan bersekutu dengan kuncinya ialah nama kumpulan dan nilainya ialah tatasusunan elemen kepunyaan kumpulan.

Amalan terbaik untuk melaksanakan salinan dalam tatasusunan dalam PHP ialah menggunakan json_decode(json_encode($arr)) untuk menukar tatasusunan kepada rentetan JSON dan kemudian menukarnya kembali kepada tatasusunan. Gunakan unserialize(serialize($arr)) untuk mensiri tatasusunan kepada rentetan dan kemudian menyahsirikannya kepada tatasusunan baharu. Gunakan RecursiveIteratorIterator untuk melintasi tatasusunan berbilang dimensi secara rekursif.

Pengisihan tatasusunan berbilang dimensi boleh dibahagikan kepada pengisihan lajur tunggal dan pengisihan bersarang. Pengisihan lajur tunggal boleh menggunakan fungsi array_multisort() untuk mengisih mengikut lajur pengisihan bersarang memerlukan fungsi rekursif untuk merentasi tatasusunan dan mengisihnya. Kes praktikal termasuk pengisihan mengikut nama produk dan pengisihan kompaun mengikut volum jualan dan harga.

Algoritma penggabungan tatasusunan dan penyahduplikasian PHP menyediakan penyelesaian selari, membahagikan tatasusunan asal kepada blok kecil untuk pemprosesan selari, dan proses utama menggabungkan hasil blok untuk nyahduplikasi. Langkah-langkah algoritma: Pisahkan tatasusunan asal kepada blok kecil yang diperuntukkan sama. Proses setiap blok untuk penyahduplikasian secara selari. Gabungkan hasil blok dan nyahduplikasi semula.

Fungsi array_group() PHP boleh digunakan untuk mengumpulkan tatasusunan dengan kunci yang ditentukan untuk mencari elemen pendua. Fungsi ini berfungsi melalui langkah berikut: Gunakan key_callback untuk menentukan kunci kumpulan. Secara pilihan, gunakan value_callback untuk menentukan nilai kumpulan. Kira elemen terkumpul dan kenal pasti pendua. Oleh itu, fungsi array_group() sangat berguna untuk mencari dan memproses elemen pendua.
