Trên Windows, một số đối số được truyền cho constructor DllMain:Linux: Cách lấy tên đầy đủ của đối tượng được chia sẻ vừa tải từ hàm tạo?
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
Từ hinstDLL Tôi có thể lấy tên đầy đủ hồ sơ của DLL bản thân sử dụng GetModuleFileName():
LPTSTR str = new TCHAR[256];
int libNameLength = GetModuleFileName(hinstDLL, str, 256);
delete[] str;
Trong ví dụ này ở trên, str bây giờ chứa tên đầy đủ của DLL vừa nạp, ví dụ: C: \ Windows \ System32 \ MyFile.dll.
Trên Linux, không có đối số được truyền cho các nhà xây dựng đối tượng chia sẻ:
void `__attribute__` ((constructor)) on_load(void);
Làm thế nào để có được tên đầy đủ của DLL trong trường hợp này? Thêm tín dụng nếu giải pháp của bạn hoạt động trên Mac, quá. :-)
Tôi không biết rằng có một cách hay. Câu hỏi của tôi trong các tình huống như thế này là "Tại sao bạn muốn biết?". Bằng cách lùi lại một cấp độ, bạn có thể thấy có một con đường dẫn đến mục tiêu thực sự của bạn mà không cần thực hiện bước mà hiện đang chặn bạn. – Omnifarious
Câu hỏi hay. Tôi muốn biết, bởi vì tôi đang phát triển một CSP và một mô-đun PKCS # 11 (các tệp DLL) cả hai đều cần phải xác minh tính toàn vẹn của riêng chúng khi chúng được nạp. Cả hai tập tin DLL được tải bởi hệ điều hành, do đó, điểm vào của tôi là constructor. Hiện tại, ý tưởng tốt nhất tôi có để xác minh tính toàn vẹn của tệp DLL là tính toán giá trị băm của tệp DLL trong hàm tạo và sau đó gửi băm đó đến máy chủ trung tâm có thể xác minh tính chính xác của băm. Tuy nhiên, tôi cần tên tập tin của DLL để có thể tính toán băm. –