Avatar billede stigc Nybegynder
11. juni 2004 - 15:34 Der er 9 kommentarer og
1 løsning

byte array i kald til c++ COM objekt

Jeg har et problem med et COM objekt jeg har lavet i Visual C++ 6.0. Funktionen ser sådan her ud:

HRESULT __stdcall CRefRate::encode(byte* key, byte* content, byte* encodedContent)
{
  encodedContent = content;
  return S_OK;          // Return to COM
}

Fra applikation i c# .Net ser code completition såden her ud.

encode(ref byte key, ref byte content, ref byte encodedContent)

Men hvordan skal jeg lige kalde den?

string key = "123";
string content = "Der var engang";
byte[] bKey = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(key);
byte[] bContent = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(content);
byte[] bResult;

x.encode(?,?,?);
Avatar billede arne_v Ekspert
11. juni 2004 - 19:02 #1
Har du prøvet det mest nærliggende:

x.encode(nKey,bContent,bResult)

?
Avatar billede arne_v Ekspert
11. juni 2004 - 19:08 #2
Men det kunen nu også være meget interessant at erstatte

ref byte

med

MarshalAs(UnmanagedType.LPArray)] byte[]

som jeg synes "passer bedre".
Avatar billede stigc Nybegynder
14. juni 2004 - 13:28 #3
Hej Arne.

Så vidt jeg forstår, er det når man skriver en declaration med dllimport at man bruger MarshalAs. Men jeg bruger et COM objekt tilføjet via "add reference", så jeg skal ikke skrive nogen delclaration.

Det eneste der kan kompile er

x.encode(ref nKey[0], ....)
Avatar billede arne_v Ekspert
14. juni 2004 - 13:49 #5
Det er korrekt at jeg tænkte dllimport.

Har du mulighed for at ændre C++ koden til:

HRESULT __stdcall CRefRate::encode(byte key[], byte content[], byte encodedContent[])

?
Avatar billede stigc Nybegynder
14. juni 2004 - 14:12 #6
Det har jeg forsøgt før. Jeg får bare et problem i interfacet man skal deklarere.
Her under er source fra en DLL (tager fra et eksempel i en bog) som kompilerer fint, hvor jeg tilføjer en funktion der hedder test. Problemet er, at man i filen angiver in og out variabler med kantede parenteser.


// This file will be processed by the MIDL tool to
// produce the type library (RefreshRate.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";

  [
      object,
      uuid(B34EF5CF-7B79-11D0-96FE-002018349816),
      dual,
      helpstring("IRefRate Interface"),
      pointer_default(unique)
  ]
  interface IRefRate : IDispatch
  {
      HRESULT RefreshRate([in] long HScan, [out, retval] long* retval);
      HRESULT GetVRes([out, retval] long* retval);
      HRESULT GetHRes([out, retval] long* retval);
      HRESULT test([in] byte key[]); <-- Den brokker sig over de kantede paranteser.
[
  uuid(B34EF5C2-7B79-11D0-96FE-002018349816),
  version(1.0),
  helpstring("RefreshRate 1.0 Type Library")
]
library REFRESHRATELib
{
  importlib("stdole32.tlb");

  [
      uuid(B34EF5D0-7B79-11D0-96FE-002018349816),
      helpstring("RefRate Class")
  ]
  coclass RefRate
  {
      [default] interface IRefRate;
  };
};
Avatar billede sovsekoder Nybegynder
04. juli 2004 - 23:16 #7
det ser ud til at du vil bruge strenge. DU kan derfor buge BSTR istedet for byte[]:
HRESULT __stdcall CRefRate::encode(BSTR key, BSTR content, BSTR* encodedContent)
{
    _bstr_t strTemp = content;
    SysFreeString(*encodedContent );
    *encodedContent = strTemp.copy();
}

C# kode:
// Lav instans af COM-object (DitCOMObj)
string key = "123";
string content = "Der var engang";
string strOut;
DitCOMobj.encode(key, content, strOut);

Hvis ikke du vil bruge BSTR, skal du bruge VARIANT (læs evt. på msdn.microsoft om VARIANT)
Avatar billede stigc Nybegynder
08. januar 2005 - 11:57 #8
Jeg kan sku' ikke huske om jeg fik det til at fungere. Men læg en svar hver især.
Avatar billede arne_v Ekspert
08. januar 2005 - 16:27 #9
jeg har vist ikke bidraget med noget her
Avatar billede stigc Nybegynder
08. januar 2005 - 22:35 #10
så lukker jeg bare.
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