Câu hỏi của tôi tương tự như Getting CLSID for a DLL file?, tôi nghĩ vậy.Cho COM DLL, trích xuất tất cả các lớp CLSID và tên giao diện tương ứng
Tôi có một thư mục với một số tệp DLL, mỗi tệp thực hiện một hoặc nhiều giao diện COM. Tôi muốn nhận được:
1) Mỗi tên giao diện 2) CLSID của lớp thực hiện các giao diện
Đối với mỗi DLL. Điều quan trọng là mọi thứ có thể được thực hiện theo chương trình (Vì vậy, tôi không thể sử dụng một số loại trình duyệt COM và tự tìm kiếm thông tin đó).
Sau đó, tôi sẽ tra cứu CLSID cho tên giao diện và gọi một số phương thức bằng IDispatch.
Một thay thế có vẻ là quét sổ đăng ký cố gắng khớp với loại, giao diện và lớp GUID và tên tệp .dll. Nhưng điều đó có vẻ chậm và không mạnh mẽ.
Có ai đó có giải pháp rõ ràng cho vấn đề này không?
EDIT:
Với phản ứng của Ben Voigt, tôi đi kèm với đoạn mã sau đó phù hợp với nhu cầu của tôi:
ITypeLib *typelib;
ITypeInfo *typeinfo;
LoadTypeLibEx(_T("c:\\mydir\\mycom1"), REGKIND_NONE, &typelib);
for (UINT i = 0;i < typelib->GetTypeInfoCount();++i) {
TYPEKIND typekind;
typelib->GetTypeInfoType(i, &typekind);
if (typekind == TKIND_COCLASS) {
// class!
CComBSTR className;
TYPEATTR *typeattr;
typelib->GetTypeInfo(i, &typeinfo);
typeinfo->GetDocumentation(MEMBERID_NIL, &className, NULL, NULL, NULL);
typeinfo->GetTypeAttr(&typeattr);
GUID classGUID = typeattr->guid;
for (UINT j = 0;j < typeattr->cImplTypes;++j) {
// interface!
CComBSTR interfaceName;
HREFTYPE hreftype;
ITypeInfo *classtypeinfo;
typeinfo->GetRefTypeOfImplType(j, &hreftype);
typeinfo->GetRefTypeInfo(hreftype, &classtypeinfo);
classtypeinfo->GetDocumentation(MEMBERID_NIL, &interfaceName, NULL, NULL, NULL);
// associate interfaceName with classGUID here
}
}
}
'DllGetClassObject' có thể có tác dụng phụ không mong muốn, vì vậy tôi không đề nghị này. Ngoài ra, nó hoàn toàn có thể có một sự kết hợp của CLSID công cộng và tư nhân. Kể từ khi DLL được nạp bằng cách tạo ra một loại công cộng, không cần phải bao giờ tải DLL bên ngoài cơ chế COM. –
Vâng, pháp lý * cuối cùng * sẽ liên quan đến việc tháo DLL và đi qua mã của DllGetClassObject(). Trong việc thực hiện điển hình (đọc: một ATL) sẽ có một cấu trúc dữ liệu toàn cầu gọn gàng liệt kê tất cả các CLSID ở một nơi. Tôi khó có thể tưởng tượng một COM DLL nơi tập hợp các coclasses được hỗ trợ có điều kiện. –
Nó phụ thuộc vào sơ đồ cấp phép lén lút như thế nào. Tôi chắc chắn có thể hình dung một yêu cầu để khởi tạo một đối tượng quản lý giấy phép và sử dụng nó trước khi bất kỳ lớp nào khác có thể được khởi tạo, câu hỏi là liệu sự thất bại từ việc cố tạo đối tượng không có giấy phép là "Tôi không biết đối tượng đó" hoặc "Đã thử để tạo ra đối tượng đó nhưng không thành công " –