2014-09-08 6 views
1

Visual C++에서 아래에 표시된 것과 같은 함수가 있습니다 .dit는 dll 코드입니다. vb6 응용 프로그램에서 DLL을 호출하고 함수를 실행하고 result.But 얻을 때마다 내 vb6 응용 프로그램 (vb6 exe를 닫지 않고)이 호출 할 때 EXE 닫혀 있지 않은 경우 마지막 결과 추가 된 값을 결과를 얻을. 나는 첫 번째 결과를 "a"두 번째 시간 "aa"등등 실행합니다. 그래서 나는이 함수의 시작 부분에 NULL로 설정되지 않는 BSTR 메시지로 인해 생각하고 사용하고 있습니다. 다음은 VC++의 코드입니다. BSTR을 처음부터 null 또는 비어있는 것으로 설정하거나 내 오류를 해결하는 방법은 무엇입니까? tempdisk_serials와 링크 http://www.winsim.com/diskid32/diskid32.cppBSTR을 null로 설정하십시오.

EDIT

아니고 문제에 도시의

BSTR __stdcall getHardDriveComputerID (short* disk_cnt , short* method) 

{ 

BSTR Message=NULL; 

int i,length; 
size_t len = 0; 

int done = FALSE; 

__int64 id = 0; 
OSVERSIONINFO version; 

strcpy (HardDriveSerialNumber, ""); 

memset (&version, 0, sizeof (version)); 
version.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); 
GetVersionEx (&version); 
if (version.dwPlatformId == VER_PLATFORM_WIN32_NT) 
{ 
     // this works under WinNT4 or Win2K if you have admin rights 
#ifdef PRINTING_TO_CONSOLE_ALLOWED 

    printf ("\nTrying to read the drive IDs using physical access with admin rights\n"); 
#endif 
    done = ReadPhysicalDriveInNTWithAdminRights(); 
    *disk_cnt=hard_disk_cnt; 

    *method=1; 

    if (! done) 
    { 
     done = ReadIdeDriveAsScsiDriveInNT(); 
     *disk_cnt=hard_disk_cnt; 

     *method=2; 

    } 


    if (! done) 
    {done = ReadPhysicalDriveInNTWithZeroRights(); 
     *disk_cnt=hard_disk_cnt; 
     *method=3; 

    if (! done) 
    { done = ReadPhysicalDriveInNTUsingSmart(); 
     *disk_cnt=hard_disk_cnt; 
     *method=4; 

    } 
} 
else 
{ 
    // this works under Win9X and calls a VXD 
    int attempt = 0; 

    // try this up to 10 times to get a hard drive serial number 
    for (attempt = 0; 
     attempt < 10 && ! done && 0 == HardDriveSerialNumber [0]; 
     attempt++) 
    done = ReadDrivePortsInWin9X(); 
     *disk_cnt=hard_disk_cnt; 
     *method=5; 

} 

if (HardDriveSerialNumber [0] > 0) 
{ 
    char *p = HardDriveSerialNumber; 

    WriteConstantString ("HardDriveSerialNumber", HardDriveSerialNumber); 

    // ignore first 5 characters from western digital hard drives if 
    // the first four characters are WD-W 
    if (! strncmp (HardDriveSerialNumber, "WD-W", 4)) 
    p += 5; 
    for (; p && *p; p++) 
    { 
    if ('-' == *p) 
     continue; 
    id *= 10; 
    switch (*p) 
    { 
     case '0': id += 0; break; 
     case '1': id += 1; break; 
     case '2': id += 2; break; 
     case '3': id += 3; break; 
     case '4': id += 4; break; 
     case '5': id += 5; break; 
     case '6': id += 6; break; 
     case '7': id += 7; break; 
     case '8': id += 8; break; 
     case '9': id += 9; break; 
     case 'a': case 'A': id += 10; break; 
     case 'b': case 'B': id += 11; break; 
     case 'c': case 'C': id += 12; break; 
     case 'd': case 'D': id += 13; break; 
     case 'e': case 'E': id += 14; break; 
     case 'f': case 'F': id += 15; break; 
     case 'g': case 'G': id += 16; break; 
     case 'h': case 'H': id += 17; break; 
     case 'i': case 'I': id += 18; break; 
     case 'j': case 'J': id += 19; break; 
     case 'k': case 'K': id += 20; break; 
     case 'l': case 'L': id += 21; break; 
     case 'm': case 'M': id += 22; break; 
     case 'n': case 'N': id += 23; break; 
     case 'o': case 'O': id += 24; break; 
     case 'p': case 'P': id += 25; break; 
     case 'q': case 'Q': id += 26; break; 
     case 'r': case 'R': id += 27; break; 
     case 's': case 'S': id += 28; break; 
     case 't': case 'T': id += 29; break; 
     case 'u': case 'U': id += 30; break; 
     case 'v': case 'V': id += 31; break; 
     case 'w': case 'W': id += 32; break; 
     case 'x': case 'X': id += 33; break; 
     case 'y': case 'Y': id += 34; break; 
     case 'z': case 'Z': id += 35; break; 
    }        
    } 
} 

id %= 100000000; 
if (strstr (HardDriveModelNumber, "IBM-")) 
    id += 300000000; 
else if (strstr (HardDriveModelNumber, "MAXTOR") || 
     strstr (HardDriveModelNumber, "Maxtor")) 
    id += 400000000; 
else if (strstr (HardDriveModelNumber, "WDC ")) 
    id += 500000000; 
else 
    id += 600000000; 

#ifdef PRINTING_TO_CONSOLE_ALLOWED 

printf ("\nHard Drive Serial Number__________: %s\n", 
     HardDriveSerialNumber); 
printf ("\nHard Drive Model Number___________: %s\n", 
     HardDriveModelNumber); 
printf ("\nComputer ID_______________________: %I64d\n", id); 

#endif 




char tempdisk_serials[]=""; 
for(i = 0 ; i<=hard_disk_cnt ; i++) 
    { 
    if(hard_disk_serial[i] != "") 
    { 
    strcat(tempdisk_serials, hard_disk_serial[i]); 
    length = strlen(tempdisk_serials); 



    /* Check if we need to insert newline */ 
    if(tempdisk_serials[length-1] != '\n') 
    { 
    tempdisk_serials[length] = '\n';    /* Append a newline  */ 
    tempdisk_serials[length+1] = '\0';   /* followed by terminator */ 
    } 
} 
} 



//Converting char[] to BSTR 
Message = SysAllocStringByteLen (tempdisk_serials, strlen(tempdisk_serials)); 



return (BSTR) Message; 

} 

실제로 변수 hard_disk_serial에서 설정된 .This 코드를 수정한다. 그것은 전역으로 char hard_disk_serial [16] [1024];로 선언됩니다 (내 질문에는 코드에 표시되지 않음). 내 함수에서이 변수를 지우는 방법은 무엇입니까? 나는 hard_disk_serial [] [] = {0}을 시도했다; 구문 오류가 발생합니다. 아무것도하지 않는 버퍼를 지우려면

+0

을 사용합니다. – chris

+0

처음에 Message = NULL로 설정하면 아무 일도 일어나지 않습니다. 문제를보기 위해 전체 코드를 게시해야합니다. –

+0

tempdisk 변수가 정리되지 않았습니다. – nikitoz

답변

1

이하는`BSTR`에 memset 함수 기능`BSTR` 주조 doc

memset (hard_disk_serial, 0, 1024*16); 
+0

완벽하게 작동했습니다. + 1 답. – Navaneet