Tôi đang viết chương trình tạo dịch vụ Windows. Vì vậy, tôi cần hai tệp .exe - một cho chương trình tạo dịch vụ và một cho chính dịch vụ đó. Nhưng tôi muốn kết hợp hai tập tin này thành một. Tôi có ý tưởng sau - mở tệp .exe mà tôi muốn đóng gói (ứng dụng dịch vụ) trong trình soạn thảo văn bản và sao chép nội dung của nó vào một chuỗi nào đó. Sau đó, tôi cần tạo một tệp .exe trống trong thư mục mong muốn và ghi chuỗi vào tệp đó. Nhưng tôi đoán đây không phải là một ý tưởng tốt. Cách tốt nhất để giải quyết vấn đề của tôi là gì?
Cảm ơn trước.
Để giải trí, tôi đã viết một chương trình "launcher" sử dụng phương pháp của bạn. Nó hoạt động, tôi đã thử nghiệm nó bằng cách sử dụng zoomin.exe làm tải trọng.
Sau khi tạo trình khởi chạy có thể thực thi được, trong Sổ tay++ Mở nó và tải tệp (zoomin.exe trong trường hợp của tôi) và sao chép (sử dụng các tùy chọn menu Chỉnh sửa | Dán đặc biệt | Sao chép nội dung nhị phân và Dán nội dung nhị phân).
Bạn có thể tìm vị trí của tải trọng trong tệp trình khởi chạy bằng cách tìm kiếm "Tệp ở đây" và "Kết thúc" trong Notepad++.
xin lưu ý rằng tôiKHÔNGSẽ không khuyến nghị nó theo bất kỳ cách nào, nó tẻ nhạt, dễ bị lỗi và dễ bị hỏng với các cài đặt trình biên dịch khác nhau. Như đã đề cập, cách tôi đã giải quyết vấn đề này trước đây là thêm tải dưới dạng tài nguyên, điều này giúp bảo trì dễ dàng hơn.
#include
#xác định SIZE_OF_ZOOMIN_EXE 11264
bộ đệm char[SIZE_OF_ZOOMIN_EXE] = "Tệp ở đây";
char end_of_buffer[] = "Kết thúc";
int main()
{
TỆP *fp = fopen("myzoomin.exe", "wb");
fwrite(bộ đệm, sizeof(bộ đệm), 1, fp);
fclose(fp);
return 0;
}
Đây là hàm main() của dịch vụ tự cài đặt mà tôi đã viết bằng C++. Ngoài ra, chương trình cho phép chạy các dịch vụ một cách tương tác.
int main(int argc, char *argv[])
{
SERVICE_TABLE_ENTRY DispatchTable[] =
{
{ SERVICE_NAME, Eng3ServiceStart },
{ NULL, KHÔNG }
};
thử {
nếu (argc >= 2) {
nếu (argc >= 3)
if (!(logfile = fopen(argv[2], "a")))
logfile = thiết bị xuất chuẩn;
if (0 == _stricmp(argv[1], "cài đặt")) {
DeleteEng3Service(); // bỏ qua giá trị trả về -- không quan tâm nếu có lỗi
trả về CreateEng3Service();
}
khác nếu (0 == _stricmp(argv[1], "gỡ cài đặt"))
trả về DeleteEng3Service();
}
// không cài đặt hoặc gỡ cài đặt, khởi động dịch vụ,
// truyền cho nó tất cả các đối số dòng lệnh.
if (!StartServiceCtrlDispatcher( DispatchTable ) ) {
if (GetLastError() == ERROR_FAILED_SERVICE_ControlLER_CONNECT) {
fprintf(logfile, "Không thể kết nối với dịch vụ. Đang khởi động ở chế độ bảng điều khiển.\n");
trả về svcmain(argc, argv);
}
ném sys_ex();
}
} bắt (ngoại lệ& ex) {
fprintf(logfile, ex.what());
}
}
Giới thiệu về c - ANSI C trong ứng dụng của tôi: làm cách nào tôi có thể đưa vào và sau đó trích xuất các tệp .exe (gói .exe thành .exe)? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/12787245/
Tôi là một lập trình viên xuất sắc, rất giỏi!