PDA

View Full Version : سوال: مشکل ساخت dll به زبان c++



manij_mhm
پنج شنبه 10 مرداد 1392, 14:18 عصر
سلام.
برنامه رو به زبان c++اجرا می کنم جواب میده و مشکلی نداره حالا این برنامه رو می خوام به یه dll استانداد برای استفاده در نرم افزار َAutoplay media studio تبدیل کنم.
وقتی dll رو اجرا می کنم COM library رو نمی تونه ایجاد کنه
می خوام اطلاعات سخت افزار و بدست بیارم .
در قسمت


hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
failed_msg="Failed to initialize COM library.";
return failed_msg;
}

برنامه متوقف میشه و نمی تونه مقداردهی کنه.
کسی می دونه به چه صورت باید dll رو درست کنم که برنامه درست اجرا شه؟!
ممنون میشم اگه کسی راهنمایی کنه.

manij_mhm
پنج شنبه 10 مرداد 1392, 15:58 عصر
Note The multi-threaded apartment is intended for use by non-GUI threads. Threads in multi-threaded apartments should not perform UI actions. This is because UI threads require a message pump, and COM does not pump messages for threads in a multi-threaded apartment.




ببخشید من متوجه نشدم. یعنی نمیشه تبدیل به dll کرد؟!

manij_mhm
پنج شنبه 10 مرداد 1392, 16:47 عصر
لینک رو خوندم. اما خیلی متوجه نشدم. که چطوری از MsgWaitForObject استفاده کنم.
تابعی که استفاده می کنم به صورت زیر:


char * __stdcall WMI_func_PhysicalMedia_SerialNumber1()
{
char * failed_msg="";
HRESULT hres;
hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres))
{
failed_msg="Failed to initialize COM library.";
return failed_msg;
}
hres = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL
);
if (FAILED(hres))
{
failed_msg="Failed to initialize security.";
CoUninitialize();
return failed_msg;
}
IWbemLocator *pLoc = NULL;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
failed_msg="Failed to create IWbemLocator object.";
CoUninitialize();
return failed_msg;
}
IWbemServices *pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"),
NULL,
NULL,
0,
NULL,
0,
0,
&pSvc
);
if (FAILED(hres))
{
failed_msg="Could not connect.";
pLoc->Release();
CoUninitialize();
return failed_msg;
}
hres = CoSetProxyBlanket(
pSvc,
RPC_C_AUTHN_WINNT,
RPC_C_AUTHZ_NONE,
NULL,
RPC_C_AUTHN_LEVEL_CALL,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE
);
if (FAILED(hres))
{
failed_msg="Could not set proxy blanket.";
pSvc->Release();
pLoc->Release();
CoUninitialize();
return failed_msg;
}
IEnumWbemClassObject* pEnumerator = NULL;
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_PhysicalMedia"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
failed_msg="Query for operating system name failed.";
pSvc->Release();
pLoc->Release();
CoUninitialize();
return failed_msg;
}
IWbemClassObject *pclsObj;
ULONG uReturn = 0;
while (pEnumerator)
{
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}
VARIANT vtProp;
hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
failed_msg= _com_util::ConvertBSTRToString(vtProp.bstrVal);
VariantClear(&vtProp);
pclsObj->Release();
break;
}
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
return failed_msg;
}



من خیلی با با ساخت dll و com اشنایی ندارم. ممنون میشم اگه راهنمایی کنید توابع رو به چه صورت باید تغییر بدم.
از

hr = CreateURLMoniker(NULL, bstrURL, &spMoniker); hr = CreateBindCtx(0, &spBindCtx);
هم خواستم استفاده کنم. ولی خطا میده!

manij_mhm
پنج شنبه 10 مرداد 1392, 19:59 عصر
من از فسمت comsole application یه پروژه درست کردم بعد در پنجره ای که ظاهر شده application type رو به DLL تغییر دادم. داخل فایل cpp هدر ها و توابع رو تعریف کردم . یه فایل def هم ایجاد کردم با با محتویات


LIBRARY "WMI_DLL_CPlusPlus"
EXPORTS
WMI_func_PhysicalMedia_SerialNumber
WMI_func_Processor_ProcessorId
WMI_func_baseBoard_SerialNumber
WMI_func_BIOS_SerialNumber
WMI_func_SoundDevice_DeviceID
WMI_func_VideoController_DeviceID
WMI_func_Keyboard_DeviceID
command


بعد هم پروژه رو build کردم. حالا که از dll استفاده می کنم. تابع command که فقط یه رشته رو برمی گردونه به درستی اجرا میشه. اما توابع دیگه در قسمت initial com متوقف میشه و نمی تونه دستورات رو اجرا کنه! در صورتی که همین توابع در کنسول c++ که می نویسم به درستی مقداردهی و اجرا میشه.

manij_mhm
پنج شنبه 10 مرداد 1392, 20:21 عصر
اینم پروژه، ممنون میشم راهنمایی کنید.
http://uplod.ir/7jgb05gkp8t6/WMI_DLL_CPlusPlus.rar.htm

manij_mhm
پنج شنبه 10 مرداد 1392, 20:23 عصر
قراره از این dll در برنامه AutoPlay Media Studio 7.0 که فایل های dll به زبان c++ رو قبول می کنه استفاده شه!

manij_mhm
پنج شنبه 10 مرداد 1392, 21:24 عصر
بله یه حورایی میشه گفت پلاگینه. ممنون.
لطف می کنید.