كيفية تعيين مسار البحث لعملية تم إنشاؤها من CreateProcess
-
14-12-2019 - |
سؤال
انا استخدم CreateProcess
استدعاء cl
لتجميع وربط برنامج C++ آخر (TestProg.cxx
) إلى ملف DLL.أنا أستحضر cl.exe
مع خيارات التجميع التالية:
خيارات التجميع:
/Od /nologo /Fo /RTC /w /Zc TestProg.cxx /DLL
الاتصال:
if ( CreateProcess(PATH_TO_EXE, COMPILATION_OPTIONS, NULL,NULL,
FALSE,0,NULL,NULL,&si,&pi) )
{
//....
}
لو TestProg.exe
يتضمن #include <iostream.h>
لقد حصلت على خطأ التجميع التالي:
TestProg.cpp(1) : fatal error C1034: iostream.h: no include path set
دون أي #include
الأمر، لقد حصلت على خطأ الربط التالي:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
ما الخطأ الذي افعله؟
لقد بحثت عن الإجابة خلال آخر 6-7 ساعات على الويب، لكن لم أجدها.يعد استخدام Windows API أمرًا جديدًا بالنسبة لي.
المحلول
إذا نظرت إلى تعريف CreateProcess
:
BOOL WINAPI CreateProcess(
__in_opt LPCTSTR lpApplicationName,
__inout_opt LPTSTR lpCommandLine,
__in_opt LPSECURITY_ATTRIBUTES lpProcessAttributes,
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in BOOL bInheritHandles,
__in DWORD dwCreationFlags,
__in_opt LPVOID lpEnvironment,
__in_opt LPCTSTR lpCurrentDirectory,
__in LPSTARTUPINFO lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInformation
);
أنت تقوم بتعيين المعلمة الاختيارية __in_opt LPVOID lpEnvironment,
ل NULL
.
ووفقا للتعريف المذكور:
مؤشر إلى كتلة البيئة للعملية الجديدة.إذا كانت هذه المعلمة فارغة، فإن العملية الجديدة تستخدم بيئة عملية الاستدعاء.
cl.exe
يحصل على معلومات الموقع ومسارات البحث في المكتبة من متغيرات البيئة - ألقِ نظرة على setenv.bat
في دليل VS.في هذه الحالة، لا يتم تشغيل عملية الاستدعاء أو العملية المستهدفة في بيئة يتم فيها تعيين هذه المتغيرات.
لديك خيار - يمكنك إنشاء متغيرات البيئة بنفسك وفقًا لـ MSDN:
تتكون كتلة البيئة من كتلة من إنهاء فريدة من السلاسل المنهمة الفارغة.كل سلسلة على الشكل التالي:
name=value\0
نظرًا لأن العلامة المتساوية تستخدم كفاصل ، يجب عدم استخدامها باسم متغير البيئة.
أو يمكنك أن تطلب تشغيل برنامجك من موجه أدوات VS.التحقق الجيد من أن المشكلة في الواقع هي تشغيل البرنامج من هذه المطالبة، بدلاً من Visual Studio، لمعرفة ما إذا كان ذلك سيؤدي إلى حل المشكلة.
السبب عدم الاستخدام #include
ينتج خطأ رابط بسبب عدم وجود تضمينات، cl.exe
لن يبحث عنها - ثم يبحث عن مكتبة وقت تشغيل C/C++.
كملاحظة جانبية - أعتقد أن المعيار في C++ هو #include <iostream>
أي بدون .h
.