2010-08-10 8 views
3

J'ai besoin d'interfacer une application Linux avec un serveur qui utilise des données bstr. Puis-je "rouler" mon propre code pour faire un bstr? Je connais les bases d'un bstr, qu'il a un en-tête avec la taille d'octet moins le terminateur null et à cause de l'entête il peut contenir des nulls au milieu de la chaîne et fondamentalement tout le reste des règles qui suivent un bstr. Je ne suis pas sûr sur les octets en ordonnant l'en-tête ou plus de détails intimes tels que dois-je passer les données sur pointant vers l'en-tête ou le 5ème octet comme com fait? Est-ce que quelqu'un sait où je peux obtenir cette information ou si quelqu'un a écrit une classe de type bstr pour Linux? Ou en général où je peux trouver des informations sur les détails de bstr plutôt que de simples aperçus généraux basés sur les bibliothèques de Microsoft?BSTR, comment faire soi-même?

Merci

+0

Ce [préfixe de longueur de lien BSTR lien est 4 octets] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069 (v = vs.85) .aspx). Je vois juste la mémoire et je suis vrai. – lsalamon

Répondre

4

Cela peut être intéressant pour vous:

Eric's Complete Guide To BSTR Semantics

EDIT: Quelques détails, comme glanée de cet article:

AVERTISSEMENT: Ceci est du haut de ma la tête, et mon contiennent de graves erreurs, jusqu'à la destruction de la causalité et la fin de l'univers connu.

struct BSTR_data { 
    short count; 
    wchar_t[] data; 
}; 

typedef wchar BSTR; 

BSTR * AllocateBSTR(wchar * str) { 
    if(str == 0) return 0; 

    short len = wstrlen(str); 

    BSTR_data * ret = new char[sizeof(short) + (sizeof(wchar_t) + 1) * len]; 

    ret->count = len; 

    memcpy(ret->data, str, sizeof(wchar_t) * 2 * len); 

    ret->data[len] = 0; 

    return (BSTR *)(ret + sizeof(short)); 
} 

void DeallocateBSTR(BSTR * str) { 
    if(str == 0) return; 

    BSTR_data * bstr = (BSTR_data*)(str - sizeof(short)); 

    delete bstr; 
} 

Cela devrait vous donner une bonne idée de ce qui se passe. Notez que si la comparabilité croisée avec Win32 est importante, vous devez utiliser SysAllocString, etc à la place de ce code.

+0

Merci, il y a en fait un article sur MSDN qui est un miroir de ceci, je ne sais pas qui a copié qui. Cela aide, mais j'ai encore besoin de détails de levier inférieurs. –

+0

lol Désolé c'est le même article sur msdn, je suis épuisé aujourd'hui. –

+0

D'accord, j'ai sorti du code de nulle part et l'ai ajouté à ma réponse. Je ne fais aucune garantie si c'est correct, cependant. –