Dim Newdata As myStruct mGetData Newdata
Dim Somedata As myStruct Somedata.Foo = 10 Somedata.Bar = 8 Somedata.Str = "Hello" mSetData Somedata
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionpour info, en VB, les tableaux, ce sont des pointeurs de SafeArray
;Begin with an array of SAFEARRAYBOUND structures; one for each dimension. Dim safeArrayBound.SAFEARRAYBOUND(1) With safeArrayBound(0) \lLbound = 1 \cElements = 20 EndWith With safeArrayBound(1) \lLbound = 1 \cElements = 20 EndWith ;Now create the array and check for success. *safeArray.SAFEARRAY = SafeArrayCreate_(#VT_BSTR, 2, @safeArrayBound()) If *safeArray ;Populate the array. Dim indices(1) For i = 1 To 20 For j = 1 To 20 indices(0) = i indices(1) = j temp = SysAllocString_("(" + Str(i) + ", " + Str(j) + ")") SafeArrayPutElement_(*safeArray, @indices(), temp) SysFreeString_(temp) Next Next EndIf
*ptrString.string = *safearray\pvData For i = 1 To 400 Debug *ptrString\s *ptrString + SizeOf(STRING) Next
SysAllocString_() should not be used for Ansi strings. It may work, but in such cases you are just lucky as it depends on the memory bytes immediately following your string. For Ansi use the appropriate API function.
SysAllocStringByteLen_().
If you set up a prototype using a p-Unicode pseudotype then you can quickly create Unicode BSTRs and then you can use SysAllocString_() for all strings. I do this in COMate. You then have to use #PB_Unicode when retrieving the strings mind.
char szReturn[MAX_PATH]; __declspec(dllexport) BSTR __stdcall RetrieveTempFilename(char* szDirectory, char* szPrefix) { char szBuffer[MAX_PATH]; if(GetTempFileName(szDirectory,szPrefix,0,szBuffer) == 0) lstrcpy(szReturn,"ERROR"); else lstrcpy(szReturn,szBuffer); return SysAllocString((OLECHAR*)szReturn); } __declspec(dllexport) void __stdcall RetrieveTempFilenameBYREF(char* szDirectory, char* szPrefix, BSTR* Res) { char szBuffer[MAX_PATH]; if(GetTempFileName(szDirectory,szPrefix,0,szBuffer) == 0) lstrcpy(szReturn,"ERROR"); else lstrcpy(szReturn,szBuffer); SysFreeString(*Res); *Res = SysAllocString((OLECHAR*)szReturn); } __declspec(dllexport) void __stdcall AlterString(BSTR* Res) { lstrcat((char*)*Res, "Modified\0"); } __declspec(dllexport) void __stdcall SmallString(BSTR* Res) { lstrcpy((char*)*Res, "small"); } __declspec(dllexport) void __stdcall LongString(BSTR* Res) { lstrcpy((char*)*Res, "long string that will be cut..."); } __declspec(dllexport) void __stdcall LongString_S(BSTR* Res) { *Res = SysAllocString((OLECHAR*)"long string that will be cut..."); }
Private Declare Function RetrieveTempFilename Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByVal szDirectory As String, ByVal szPrefix As String) As String Private Declare Sub RetrieveTempFilenameBYREF Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByVal szDirectory As String, ByVal szPrefix As String, ByRef Result As String) Private Declare Sub AlterString Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByRef Result As String) Private Declare Sub SmallString Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByRef Result As String) Private Declare Sub LongString Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByRef Result As String) Private Declare Sub LongString_S Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByRef Result As String) Private Sub Form_Load() Dim sResult As String MsgBox RetrieveTempFilename(vbNullString, vbNullString), , "Return BSTR" RetrieveTempFilenameBYREF vbNullString, vbNullString, sResult MsgBox sResult, , "ByRef BSTR" sResult = Space$(10) SmallString sResult MsgBox sResult, , "SmallString => 'small'" LongString sResult MsgBox sResult, , "LongString Unsafe => 'long st[?????]'" LongString_S sResult MsgBox sResult, , "LongString_S : String will be reallocated large enough" End Sub
struct Data { int Val; BSTR Str; }; __declspec(dllexport) void __stdcall GetData(Data* vtData) { vtData->Val = 3112; if (vtData->Str) SysFreeString(vtData->Str); vtData->Str= SysAllocString((OLECHAR*)"Hello world from Struct..."); }
Private Declare Sub GetData Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByRef Data As Data) Private Type Data Val As Long Str As String End Type Private Sub Form_Load() Dim tData As Data GetData tData MsgBox tData.Val & vbNewLine & tData.Str End Sub
--------------------Configuration: TestDll - Win32 Debug--------------------
Compiling...
StdAfx.cpp
Compiling...
TestDll.cpp
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(17) : error C2143: syntax error : missing ';' before '__stdcall'
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(17) : error C2501: 'BSTR' : missing storage-class or type specifiers
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(24) : error C2065: 'SysAllocString' : undeclared identifier
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(24) : error C2065: 'OLECHAR' : undeclared identifier
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(24) : error C2059: syntax error : ')'
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(25) : warning C4508: 'RetrieveTempFilename' : function should return a value; 'void' return type assumed
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(27) : error C2061: syntax error : identifier 'BSTR'
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(34) : error C2065: 'SysFreeString' : undeclared identifier
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(34) : error C2065: 'Res' : undeclared identifier
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(34) : error C2100: illegal indirection
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(35) : error C2100: illegal indirection
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(35) : error C2059: syntax error : ')'
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(39) : error C2448: '' : function-style initializer appears to be a function definition
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(44) : error C2448: '' : function-style initializer appears to be a function definition
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(49) : error C2448: '' : function-style initializer appears to be a function definition
C:\RetourStringC(Renfield)\TestDll\TestDll.cpp(54) : error C2448: '' : function-style initializer appears to be a function definition
Error executing cl.exe.
TestDll.dll - 15 error(s), 1 warning(s)
#include <windows.h> char szReturn[MAX_PATH]; struct Data { int Val; BSTR Str; }; __declspec(dllexport) BSTR __stdcall RetrieveTempFilename(char* szDirectory, char* szPrefix) { char szBuffer[MAX_PATH]; if(GetTempFileName(szDirectory,szPrefix,0,szBuffer) == 0) lstrcpy(szReturn,"ERROR"); else lstrcpy(szReturn,szBuffer); return SysAllocString((OLECHAR*)szReturn); } __declspec(dllexport) void __stdcall RetrieveTempFilenameBYREF(char* szDirectory, char* szPrefix, BSTR* Res) { char szBuffer[MAX_PATH]; if(GetTempFileName(szDirectory,szPrefix,0,szBuffer) == 0) lstrcpy(szReturn,"ERROR"); else lstrcpy(szReturn,szBuffer); if (*Res) SysFreeString(*Res); *Res = SysAllocString((OLECHAR*)szReturn); } __declspec(dllexport) void __stdcall AlterString(BSTR* Res) { lstrcat((char*)*Res, "Modified\0"); } __declspec(dllexport) void __stdcall SmallString(BSTR* Res) { lstrcpy((char*)*Res, "small"); } __declspec(dllexport) void __stdcall LongString(BSTR* Res) { lstrcpy((char*)*Res, "long string that will be cut..."); } __declspec(dllexport) void __stdcall LongString_S(BSTR* Res) { if (*Res) SysFreeString(*Res); *Res = SysAllocString((OLECHAR*)"long string that will be cut..."); } __declspec(dllexport) void __stdcall GetData(Data* vtData) { vtData->Val = 3112; if (vtData->Str) SysFreeString(vtData->Str); vtData->Str= SysAllocString((OLECHAR*)"Hello world from Struct..."); } __declspec(dllexport) long __stdcall SolarSystem(SAFEARRAY** vtData) { SAFEARRAYBOUND tDim; char sPlanet[10]; if (*vtData) SafeArrayDestroy(*vtData); tDim.lLbound = 0; tDim.cElements = 9; *vtData = SafeArrayCreate(VT_BSTR, 1, &tDim); for(LONG i = 0; i<9; i++) { switch(i) { case 0: lstrcpy(sPlanet, "Mercure"); break; case 1: lstrcpy(sPlanet, "Venus"); break; case 2: lstrcpy(sPlanet, "Terre"); break; case 3: lstrcpy(sPlanet, "Mars"); break; case 4: lstrcpy(sPlanet, "Jupiter"); break; case 5: lstrcpy(sPlanet, "Saturne"); break; case 6: lstrcpy(sPlanet, "Uranus"); break; case 7: lstrcpy(sPlanet, "Neptune"); break; case 8: lstrcpy(sPlanet, "Pluton"); break; }; SafeArrayPutElement(*vtData, &i, SysAllocString((OLECHAR*)sPlanet)); } return 9; }
Private Declare Function SolarSystem Lib "E:\Developpement\TestDll\Debug\Testdll.dll" (ByRef Data() As String) As Long Private Sub Form_Load() Dim xsPlanets() As String Dim i As Long For i = 0 To SolarSystem(xsPlanets) - 1 MsgBox xsPlanets(i) Next End Sub
LIBRARY TestDll EXPORTS RetrieveTempFilename RetrieveTempFilenameBYREF AlterString SmallString LongString GetData SolarSystem