Avatar billede snepnet Nybegynder
02. maj 2001 - 14:15 Der er 19 kommentarer og
1 løsning

ATL COM switch på BSTR - hvordan

Jeg skal bare bruge et lille stykke kode, hvor der switches på en BSTR. compileren bliver ved med at sige at den ikke kan konvertere fra det ene til det andet (alt efter hvad jeg nu prøver), så hvis der er nogle der lige ved hvad der skal til - kunne det være fedt.

eksempel:
put_SomeString(BSTR bstrString)

switch (bstrString)
{
  case \'blablabla\':
    //do dit do dat;
  default:
    //whatever else to do;
}

dette virker jo så ikke, men hvis der er en der kender et par type-tricks der kan puttes ind mellem funktionsnavn og switch, er der 500 hurtige
Avatar billede bratkid Nybegynder
02. maj 2001 - 14:54 #1
okay jeg  ved ikke hvad du mener:) men jeg ville skrive sådan her:


put_SomeString(BSTR bstrString)

switch (bstrString)
{
  case: cout << \"blablabla\";
    //do dit do dat;
  default:
    //whatever else to do;
}


men hvis det ikke virker så ignorer mig:) og lad være med at kommenterer det...jeg er ikke helt med:)
Avatar billede borrisholt Novice
02. maj 2001 - 15:31 #2
En BSTR er jo blot en double-byte char string. Der findes da funktionet til at konvetere til en alm Char * som du kan switche på ...
Avatar billede snepnet Nybegynder
02. maj 2001 - 19:36 #3
borrisholt-> og det er jo så lige præcis de funktioner jeg spørger efter :) skriv et eksempel til mig, og høst pointene...
Avatar billede borrisholt Novice
02. maj 2001 - 19:58 #4
Det her burde virke men har ikke lige haft mulighed for at teste det :

    BSTR  _bstr;
    CComBSTR _bstrText;
  _bstrText.Attach(_bstr);

    char message[512];
    WideCharToMultiByte(CP_ACP, 0, _bstrText, _bstrText.Length() + 1, message, _bstrText.Length() + 1, 0, 0);

   
    printf(\"%s!\\n\", message);

}

Jens B http://fotx.net/borrisholt.com
Avatar billede snepnet Nybegynder
02. maj 2001 - 20:00 #5
jeg checker det om et par timer... så må vi jo se hvordan det går :)
Avatar billede borrisholt Novice
02. maj 2001 - 20:00 #6
Det her er testet og virker :

#include \"stdafx.h\"
#include <Atlbase.h>



int main(int argc, char* argv[])
{
 
    CComBSTR _bstrText;  // BSTR points to NULL
    _bstrText = \"Hello World\";    // Initialize with an assignment operator.

   
    char message[512];
    WideCharToMultiByte(CP_ACP, 0, _bstrText, _bstrText.Length() + 1, message, _bstrText.Length() + 1, 0, 0);

   
    printf(\"%s!\\n\", message);
    return 0;
}


Som jeg viste dig før kan du konvetere en BSTR  til en CComBSTR vha attach operatoren.

Jens B
Avatar billede borrisholt Novice
02. maj 2001 - 20:02 #7
bermærk det første eksempel HELT SIKKERT fejler fordi jeg ikke har initializeret _bstr med en værdi af nogen art. Men du ved kig på Princippet ....


Jens B
Avatar billede snepnet Nybegynder
02. maj 2001 - 20:07 #8
har lige svigermekanikken på besøg... prøver det så snart de er smuttet.... jeg går ud fra at det er din plan at jeg skal switche på message, så den model prøver jeg, men det ser godt ud synes jeg, omend WideCharToMultiByte() er lidt af en stinker :)
Avatar billede borrisholt Novice
02. maj 2001 - 20:20 #9
du kan ikke switche på en char * men du kan lave en StrStr som sammenlignet to strenge og retunerer 0 hvis de er ens. Normalt bruges den til sortering, men her bruger vi den anderleds.

det her skulle virke :

#include \"stdafx.h\"
#include <Atlbase.h>




void put_SomeString(const CComBSTR _bstrText)
{
   
  int len =  _bstrText.Length();

  char * message = new char[len];
  WideCharToMultiByte(CP_ACP, 0, _bstrText, len + 1, message, len + 1, 0, 0);
 
  CharUpperBuff(message, len);

  if (StrCmp(message, \"HELLO WORLD\") == 0 )     
    printf(\"%s\\n\", message);

}

Jens B http://fotx.net/borrisholt
int main(int argc, char* argv[])
{
 
    CComBSTR _bstrText;  // BSTR points to NULL
    _bstrText = \"Hello World\";    // Initialize with an assignment operator.

    put_SomeString(_bstrText);
    return 0;
}


Jens B

Avatar billede snepnet Nybegynder
02. maj 2001 - 21:57 #10
øhhh.... det er jo ikke det jeg har brug for. mit ønske er stadig at switche på indholdet af en BSTR, og det er skridtet direkte fra min BSTR og til en type jeg kan switche på, og som indeholder den samme streng som den oprindelige BSTR jeg har brug for. jeg har ikke noget problem med at foretage en sammenligning mellem to BSTR... jeg kan bare ikke finde ud af hvad jeg skal gøre for at kunne switche på værdien og en serie if-sætninger er nu engang ikke en switch. så.... hvis jeg ikke kan switche på nogle af de typer der konverteres til i de eksempler du har skrevet, må du til tegnebrædtet igen :)
Avatar billede borrisholt Novice
02. maj 2001 - 21:59 #11
Helt nøjagtigt hvorfor vil du absolut switche .. ?
Avatar billede snepnet Nybegynder
02. maj 2001 - 22:32 #12
fordi der er situationer hvor jeg finder det hensigtsmæssigt at have en switch i koden, istedet for en masse if-sætninger...
Avatar billede borrisholt Novice
02. maj 2001 - 22:37 #13
du kan switche på det første bogstave hvis det var noget ?

Jens B
Avatar billede borrisholt Novice
02. maj 2001 - 22:40 #14
Ellers så prøv lige at skrive til Jens@Borrisholt.com så kan du få mit tlf. nr.

Jens B
Avatar billede snepnet Nybegynder
02. maj 2001 - 22:53 #15
ok... jeg ringer ikke til dig, men det jeg specifikt skal bruge switchen til er, at jeg gerne vil kunne skrive \"kommandoer\" til en COM-komponent jeg benytter i en anden forbindelse. der skal så selvfølge ske noget forskelligt, alt afhængigt af hvad jeg skriver til komponenten. antallet af kommandoer kan blive stor med tiden, og derfor ville jeg gerne have det i en switch, og når man så ikke lige kan få noget til at virke som man troede var enkelt, bliver man jo frygtelig stædig... det er derfor at jeg oprettede spørgsmålet :) (desuden kan jeg ikke fatte at det skal være så besværligt... det skulle da være lige til skulle man mene)
Avatar billede borrisholt Novice
02. maj 2001 - 22:55 #16
Jo det er meget fint .. Men når nu man ikke kan switch på en streng så er du altså på spanden ....
Avatar billede borrisholt Novice
02. maj 2001 - 22:59 #17
hvad med at stoppe alle dine kommandoet i en std::map og så smide din switch væk ?
Avatar billede snepnet Nybegynder
02. maj 2001 - 23:15 #18
kender ikke lige en std::map, men jeg er med på hvad du mener... men jeg har da lige fundet ud af at jeg er lidt af en nød.... du har da helt ret i at man ikke kan switche på en streng. jeg tror at jeg har siddet med den forestilling fordi jeg for nylig har siddet og kodet i nogle andre miljøer (ikke C++), hvor der kunne laves en switch på strenge... nok noget som compileren så har hygget sig med. du får dine point, da jeg jo sådan set har et endeligt svar :) (omænd det er nok så ubrueligt :)

og det er jo nok mere fornuftigt at bruge en map under alle omstændigheder.... det skulle vist også afvikles hurtige, så den er jo god nok.

tak for hjælpen jens.
Avatar billede borrisholt Novice
02. maj 2001 - 23:24 #19
Jammen jeg takker mange gange for din genorøsitet .. men du fik da lært at konvetere sådan en fætter til et char array ...

jens B
Avatar billede snepnet Nybegynder
02. maj 2001 - 23:27 #20
hehe... ja det gjorde jeg jo :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester