2012-09-24 12 views
5

से लिस्टबॉक्स में जोड़ें हाय मैं उपयोगकर्ता मशीन पर COM पोर्ट्स को जांचने की कोशिश कर रहा हूं और फिर उन्हें C++ में कस्टम एक्शन के माध्यम से एक सूची बॉक्स में डालने का प्रयास कर रहा हूं। यह जानकारी दिखाई नहीं दे रहा हालांकि और जब मैं डिबग सभी यह कह रहे हैं यह लिस्टबॉक्स के लिए मेरे Wix कोड है "फ़ंक्शन निष्पादन विफल":विक्स: सी ++ कस्टम एक्शन

 <Control Id="ListBoxID" Type="ListBox" Property="COMPORT" Width="80" Height="40" X="80" Y="165" Indirect="no"> 
     <ListBox Property="COMPORT"> 
     </ListBox> 
     <Condition Action="hide">(DEVICETYPE = "1")</Condition> 
     <Condition Action="show">(DEVICETYPE = "2")</Condition> 
     <Condition Action="show">(DEVICETYPE = "3")</Condition> 
     <Condition Action="hide">(DEVICETYPE = "4")</Condition> 
    </Control> 

और ये मेरे कस्टम क्रिया है:

extern "C" UINT __stdcall GetDatascanPort(MSIHANDLE hInstall) 
{ 

HRESULT hr = S_OK; 
UINT er = ERROR_SUCCESS; 
HKEY keyHandle; 
DWORD i,openStatus,cb_value_buffer,cb_buffer,dwType; 
char value_buffer[100],buffer[10]; 
MSIHANDLE hTable = NULL; 
MSIHANDLE hColumns = NULL; 
MSIDBERROR insertError = MSIDBERROR_NOERROR; 

hr = WcaInitialize(hInstall, "GetDatascanPort"); 
ExitOnFailure(hr, "Failed to initialize"); 

WcaLog(LOGMSG_STANDARD, "Initialized."); 


if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, 
        "HARDWARE\\DEVICEMAP\\SERIALCOMM", 
        0, 
        "", 
        REG_OPTION_NON_VOLATILE, 
        KEY_QUERY_VALUE, 
        default_sa(), 
        &keyHandle, 
        &openStatus) == ERROR_SUCCESS) 
{ 
    for (i=0;;i++) 
    { 
     cb_value_buffer = sizeof(value_buffer); 
     cb_buffer = sizeof(buffer); 

     if (RegEnumValue(keyHandle, 
         i, 
         value_buffer, 
         &cb_value_buffer, 
         NULL, 
         &dwType, 
         (unsigned char *) buffer, 
         &cb_buffer) != ERROR_SUCCESS) 
         break; 

     if (dwType != REG_SZ || strlen(buffer) > 6) 
      continue; 

     hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, 0, buffer); 
     ExitOnFailure(hr, "failed to set COMPORT"); 


    } 

    RegCloseKey(keyHandle); 

    if (hTable) 
     MsiCloseHandle(hTable); 
    if (hColumns) 
     MsiCloseHandle(hColumns); 
    return WcaFinalize(hr); 

} 

LExit: 
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; 
return WcaFinalize(er); 
} 

क्या कोई मेरी मदद कर सकता है? धन्यवाद

संपादित करें: मैंने इसे अपने लिस्टबॉक्स को अपडेट किया है लेकिन यह सुगम, अजीब प्रतीकों नहीं है। मैंने अपने चार को एक सीएसटींग में बदल दिया और ऐसा लगता है कि यह गलत तरीके से प्रदर्शित करने के अलावा काम करता है।

CString ComPort; 
    ComPort = buffer; 

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, ComPort, ComPort); 
ExitOnFailure(hr, "failed to set COMPORT"); 

इसके अलावा लक्ष्य कंप्यूटर सीरियल पोर्ट हो सकता है क्या उन सब को पाश के लिए अंदर मेरे समारोह के साथ सूचीबद्ध किया है करने के लिए सबसे अच्छा तरीका है?

धन्यवाद

+0

आप अपनी कस्टम कार्रवाई निष्पादित करने का प्रयास कैसे कर रहे हैं? क्या आपने चेक किया है (निर्भरता वाकर का उपयोग करके) कि यह वास्तव में आपके डीएलएल से निर्यात किया जा रहा है? – snowdude

+0

विक्स में कस्टम कार्रवाई को बुलाया जा रहा है क्योंकि मैं इसमें टूटने में सक्षम था ताकि समस्या न हो। धन्यवाद .. :) –

+0

तो, आप त्रुटि कहां निष्पादित करने में विफल रहे हैं? क्या आपने भाग लिया है: 'msiexec/l * vx'? – snowdude

उत्तर

0

यह काम कर रहा है।

 MultiByteToWideChar(CP_ACP,0,buffer,-1,ComPort,strlen(buffer)); 
     ComPort[strlen(buffer)]=0; 

     hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", value++, ComPort, ComPort); 
     ExitOnFailure(hr, "failed to set COMPORT"); 

धन्यवाद मुझे पता था कि मैं वाइड चार को चार कन्वर्ट करने के लिए किया था @snowdude: इस कोड मैं बैठाना संशोधन यह दूसरों की मदद कर सकते है।

1

मुझे लगता है कि आप फ़ंक्शन में बहुत से तर्क पारित कर रहे हैं। चूंकि WcaAddTempRecord हस्ताक्षर परिवर्तनीय तर्क सूची का उपयोग करता है, यह प्रकार को मान्य नहीं करेगा।

बजाय:

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, 0, buffer); 

कोशिश:

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", nIndex, buffer); 

कहाँ nIndex आप डालने रहे हैं आइटम के 1 आधारित सूचकांक है। यह भी सुनिश्चित नहीं है कि आप char का उपयोग कर सकते हैं, तो आपको wchar_t का उपयोग करने की आवश्यकता हो सकती है।

अपने चार बफर के बजाय wchar_t बफर का उपयोग करने का एक त्वरित परीक्षण आज़माएं और देखें कि यह काम करता है या नहीं। अन्य सभी कोड हटाएं और केवल एक प्रविष्टि जोड़ें:

hr = WcaAddTempRecord(&hTable, &hColumns, L"ListBox",&insertError, 0, 4, L"COMPORT", 1, L"TestPort"); 
+0

मेरे पास फ़ंक्शन में बहुत अधिक तर्क नहीं थे क्योंकि सूची बॉक्स में चार है इसलिए मेरे फ़ंक्शन की आवश्यकता है 4. इसे एक ही प्रविष्टि का उपयोग करके काम करने के लिए प्रबंधित किया गया है, अब इसे मेरे चर के साथ आज़माने के लिए .. :) –