Toon posts:

[C++] SafeArray

Pagina: 1
Acties:

Verwijderd

Topicstarter
Mijn programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
typedef struct {
  long        Getal1;
  long        Getal2;
  long        Getal3;
  long        Getal4;
  long        Getal5;
  long        Getal6;
} Getallen;

typedef struct {
  LPVOID      String1;
  LPVOID      String2;
  Getallen   GetallenToGive;
} RudolfWissel;

VARIANT _stdcall FillArray(WCHAR * WebPage) {
  SAFEARRAY *pSA;
  SAFEARRAYBOUND aDim[1];
  HRESULT hr;
  VARIANT vOut;

  VariantInit(&vOut);

  aDim[0].lLbound= 0;
  aDim[0].cElements= 3;

  pSA = SafeArrayCreate(VT_VARIANT,1,aDim);
  if (pSA != NULL) {
    long aLong[1];
    // iterate over array adding VARIANTs of type VT_BSTR
    for (long l = aDim[0].lLbound; (unsigned) l < (aDim[0].cElements + aDim[0].lLbound); l++) {
      RudolfWissel val;
      char * tmp = "[C++] String1";
      char * tmp2 = "[C++] String2";
//      pszString2vbString((void*)&tmp, tmp, strlen(tmp)+1);
      val.String1 = (char*)malloc(strlen(tmp) * 2 + 1);
      val.String2 = (char*)malloc(strlen(tmp2) * 2 + 1);

      PackVBStr(tmp, &val.String1);
      PackVBStr(tmp2, &val.String2);
      val.GetallenToGive.Getal1 = 0;
      val.GetallenToGive.Getal2 = 1;
      val.GetallenToGive.Getal3 = 2;
      val.GetallenToGive.Getal4 = 3;
      val.GetallenToGive.Getal5 = 4;
      val.GetallenToGive.Getal6 = 5;

      aLong[0]= l; // set index value
      if (hr = SafeArrayPutElement(pSA, aLong, (void*) &val)) { // "correctly" copies VARIANT
        SafeArrayDestroy(pSA); // does a deep destroy on error
        vOut.vt = VT_DECIMAL;
        vOut.lVal = hr;
        return vOut;

      }
    }
  }

  vOut.vt = VT_SAFEARRAY;
  vOut.pparray = &pSA;

  return vOut;
}

USHORT PackVBStr(char * InBuffer, LPVOID *OutBuffer)  {
int len;
int rc=1;

    if (!OutBuffer)
        rc = 0;
    else
    {
        if (InBuffer)
        {
            len = GetvbStringLen(*OutBuffer);
            pszString2vbString(OutBuffer, InBuffer, len);
        }
        else
            pszString2vbString(OutBuffer, "", 0);
    }
    return rc;
}                                       

USHORT pszString2vbString(LPVOID *OutBuffer, LPVOID InBuffer, USHORT BufLen)
{
    int count=0;
    char * temp;
    char * temp1;
    char * pszString;

    temp=(char*)malloc((BufLen*2)+1);
    memset(temp,'\0',((BufLen*2)+1));
    temp1=temp;
    pszString = (char*)InBuffer;

    for (count = 0; count < BufLen; count++)
    {
        memset(temp1++,pszString[count],1);
        temp1++; // \0
    }
    
    memcpy(*OutBuffer, temp, ((BufLen*2)+1));

    return(1);
}


/*

  Algemeen

  */
USHORT GetvbStringLen(LPVOID InBuffer)
{
char *t;
int count=0;
int BufLen=0;

    t = (char*)InBuffer;       
   
    while(count<2)
    {
        if(*t != '\0')
        {
            count = 0;
            BufLen++;
        }
        else 
        {
            count++;
        }    
        t++;     
    }
    return(BufLen);
}



Dit is voor van een webpagina, getallen via C++ in te lezen in een Visual Basic array in een bepaalde struct/type...
Het is nooit van op voorhand bepaald hoeveel getallen er zullen zijn...

Maar schijnbaar doe ik iets fout want:
code:
1
      if (hr = SafeArrayPutElement(pSA, aLong, (void*) &val)) { // "correctly" copies VARIANT


daar stopt die altijd.

Als iemand mij op weg kan helpen waar mijn fout zit?
En genereer ik geen 'leaks' in dit programma? 8)7

Verwijderd

Topicstarter
Wat ik hierna ga proberen, eenmaal i kgezien heb hoe ik simpelweg getallen kan inlezen daarin, een SafeArrayReDim zodat dit echt 'on the fly' kan gebeuren & met willekeurige grootte van tabel.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Waar staat SafeArrayPutElement gedefinieerd?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Orphix schreef op 13 november 2002 @ 14:02:
Waar staat SafeArrayPutElement gedefinieerd?
In oleauto.h

duh

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Ben eigenlijk wel benieuwd wat er allemaal gebeurt hier :

Je hebt een struct met o.a. twee pointers daarin
Je geeft deze pointers een waarde door met malloc ruimte te maken
Je schrijft dit geheel met SafeArrayPutelement weg in een safearray

Vraagjes:

Waar geef je de ruimte die gealloceerd word terug ?
Hoe weet die SafeArrayPutElement de grootte van je 'element' ( struct ) ? ( Je cast em immers naar een void * )
Moet je niet variants toevoegen aan het array ipv normale structs ?

[edit]
Beetje zoals hier:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  
  VARIANT var;
  SAFEARRAY FAR* psa;
  SAFEARRAYBOUND rgsabound[1];
  rgsabound[0].lLbound = 0;
  rgsabound[0].cElements = 1;

  psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
  
  if(psa == NULL){
    HRESULT = ResultFromScode(E_OUTOFMEMORY);
    // goto LError0;
    // Instead do some errorhandling which won't mess up ur rep with curry >:)
    // PS Die voorbeelden van MS worden telkens ranziger ...
  }

  // Code omitted here for brevity.
  // More code omitted here for further brevity. ;)

  V_VT(&var) = VT_DISPATCH;
  SafeArrayPutElement(psa, ix, &var);

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 24-08 22:38
Ben je er inmiddels al uit?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1