Avatar billede jetsetter Nybegynder
24. juli 2009 - 02:01 Der er 6 kommentarer

string i c++

Jeg har nu prøvet at få mit string argument i en c++ dll til at virke, dog uden held. Nogen der kan se hvad der er galt? (markerer med fed der hvor jeg har ændret koden og den derfor desværre stoppede med at virke..)

DLL-koden, bliver kaldt fra et andet program via "SQLProcedureSendOrders" og der hentes en text streng fra en stored procedure som er af formatet char(100), output parameteren i SP hedder @order.




#define WIN32_LEAN_AND_MEAN

#define MT4_EXPFUNC __declspec(dllexport)


#include <iostream>
#include <string>
using namespace std;







static string SQLexecProcedure(char *bBroker, char *nprc );


// call as a procedure passing parameters
MT4_EXPFUNC string __stdcall SQLProcedureSendOrders(char *Broker,char *sProcedure)
{
      string Ret =    SQLexecProcedure( Broker, sProcedure );
    return(Ret);
}


#include "stdafx.h"
#include <stdio.h>
#import "C:\Program Files\Common Files\System\ado\msado20.tlb" \
        rename("EOF","ADOEOF") rename("BOF","ADOBOF")

using namespace ADODB;

inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };




// procedure call method
string SQLexecProcedure(char *bBroker, char *nprc )
{
 
    HRESULT hr = S_OK;
  _CommandPtr pcmd = NULL;
  _ConnectionPtr pConnection = NULL;
  _bstr_t strMessage, strAuthorID;

      ::CoInitialize(NULL);



string codRet = "-1";




  try {
      TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
      hr = pConnection->Open("dsn=xxxx;", "xxx", "xxxx", adConnectUnspecified);
      pConnection->CursorLocation = adUseClient;
      TESTHR(pcmd.CreateInstance(__uuidof(Command)));
      pcmd->CommandText = nprc;  // procedure name
      pcmd->CommandType = adCmdStoredProc;
   
      _ParameterPtr  pParm1 = pcmd->CreateParameter( _bstr_t("@order"), adChar,  adParamOutput, 0 ,0    );
      pcmd->Parameters->Append( pParm1 );


    _ParameterPtr Par1 = pcmd->CreateParameter("@psBroker",adChar, adParamInput, strlen(bBroker) ,bBroker );
        pcmd->Parameters->Append(Par1);

      pcmd->ActiveConnection = pConnection;
      int hr = pcmd->Execute( 0, 0, adCmdStoredProc );
      if( FAILED(hr) )
      {
                codRet = "-1";
      }
      else
      {
        pParm1 = pcmd->Parameters->GetItem(_bstr_t("@order"));    // obtain from the procedure

                codRet = pParm1->GetValue();



      }
  }
  catch(_com_error  ) {
      //
      // if necessary, process the execution error
          //
      codRet = "-1";

  }
  if (pConnection)
      if (pConnection->State == adStateOpen)
        pConnection->Close();




  ::CoUninitialize();
    return (codRet);
}
Avatar billede arne_v Ekspert
24. juli 2009 - 03:51 #1
Har du rettet fra char* til string?

Hvis ja: kan det der kalder håndtere en STL string?
Avatar billede jetsetter Nybegynder
24. juli 2009 - 13:05 #2
Jeg har rettet fra int til string.

DLL bliver kaldt fra MQ4, et sprog fra metatrader.

Og kaldet ser sådan ud:

string SQLProcedureSendOrders (string, string );

string Prc;

Prc =    SQLProcedureSendOrders ( AccountCompany( ), "MT4_SendOrders");


Print(Prc);
Avatar billede arne_v Ekspert
24. juli 2009 - 19:00 #3
Proev evt. og returner en char* fremfor en string.

Hvis MQ4 bruger C konvention saa kan den ikke klare en STL string.
Avatar billede jetsetter Nybegynder
24. juli 2009 - 22:37 #4
Hvad er forskellen på en char* og en char? Er den ene en pointer?

Jeg er ny i C++.

Jeg ved ikke hvornår jeg skal bruge char* og hvornår jeg skal bruge char.

Jeg har også set at man kan putte en * på et argument, foreksempel:


char *parameter


hver betyder * her?
Avatar billede jetsetter Nybegynder
24. juli 2009 - 22:53 #5
Jeg har prøvet tidligere og nu, med char*, problemet her er at går jeg lægger parametren ind i "codRet", får jeg denne fejl:

Error    1    error C2440: '=' : cannot convert from '_variant_t' to 'char *'    c:\documents and settings\all users\documents\eas in testing\mssql_link\sendorders\sendorders\sendorders.cpp    81    SendOrders


Jeg har prøvet at løse dette ved at konverterer med følgende kode:

              _variant_t var = pParm1->GetValue();

          if (V_VT(&var) == VT_BSTR)
        {
                  codRet = (char*) (_bstr_t) var;
              }


men kunne ikke få det til at virke, nu prøvede jeg igen, og fik -1 fejl meddelelsen, hvilket typer på at der er fejl i koden...
Avatar billede arne_v Ekspert
26. juli 2009 - 03:49 #6
Får codret den rigtige værdi?

Måske skulle værdien kopieres til en buffer fremfor at ligge i noget som bliver deallokeret inden det skal bruges?
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