Declare Function означает, что функция возвращает тип Variant (хотя здесь это неважно).
VBStr.h:
int WINAPI cppTEXT(LPWSTR pStr);
int WINAPI cppTEXT2(LPSTR pStr);
VBStr.cpp:
#include"stdafx.h"#include"VBStr.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int WINAPI cppTEXT(LPWSTR pStr)
{
wcscpy(pStr, L"У попа была собака");
return wcslen(pStr);
}
int WINAPI cppTEXT2(LPSTR pStr)
{
strcpy(pStr, "У пыпа была собака");
return strlen(pStr);
}
VBStr.def
LIBRARY VBSTR
EXPORTS
cppTEXT @1
cppTEXT2 @2
Form1.frm:
Option Explicit
Private Declare Function cppTEXT Lib"VBStr.DLL" (ByVal STRAddr As Long) As Long
Private Declare Function cppTEXT2 Lib"VBStr.DLL" (ByVal STR As String) As Long
Function MYTEXT() As String
Dim MyStr As String
MyStr = String$(255, vbNullChar)
MYTEXT = Left$(MyStr, cppTEXT(StrPtr(MyStr)))
End Function
Function MYTEXT2() As String
Dim MyStr As String
MyStr = String$(255, vbNullChar)
MYTEXT2 = Left$(MyStr, cppTEXT2(MyStr))
End Function
Private Sub Command1_Click()
Label1.Caption = "<<" & MYTEXT() & ">>"
Label2.Caption = "<" & MYTEXT2() & ">"End Sub
Вопрос:
1. правильно ли я возвращаю строку копируя её в область памяти, выделеной вызывающим процессом? (в случае с С — нечто типа wchar_t *test; test = new wchar_t[64]
2. Как правильно эту ДЛЛ вызвать из VB6 (чтобы вернуть в вызывающую программу строку wstring)?
Спасибо.
K>Вопрос: K>1. правильно ли я возвращаю строку копируя её в область памяти, выделеной вызывающим процессом? (в случае с С — нечто типа wchar_t *test; test = new wchar_t[64]
Правильно, но если учесть, что LPCTSTR — это не совсем LPWSTR, то неправильно.
K>2. Как правильно эту ДЛЛ вызвать из VB6 (чтобы вернуть в вызывающую программу строку wstring)?
Никак, потому что VB умеет вызывать только stdcall функции.
K>>Вопрос: K>>1. правильно ли я возвращаю строку копируя её в область памяти, выделеной вызывающим процессом? (в случае с С — нечто типа wchar_t *test; test = new wchar_t[64]
Vi2>Правильно, но если учесть, что LPCTSTR — это не совсем LPWSTR, то неправильно.
K>>2. Как правильно эту ДЛЛ вызвать из VB6 (чтобы вернуть в вызывающую программу строку wstring)?
Vi2>Никак, потому что VB умеет вызывать только stdcall функции.
Поправил:
extern "C" void __declspec(dllexport) __stdcall EnumInterface(LPWSTR p_outString)
Теперь правильно?
Обращаюсь из VB k DLL так:
Declare Function EnumInterface Lib "С:\mydll.dll" (ByVal lpBuffer As String)
' Резервируется буфер, достаточный для
' размещения полного имени каталога
BufferLength& = 256
Buffer$ = Space$(BufferLength)
Call EnumInterface(Buffer$)
И тут мы слетаем......
Что я делаю снова не правильно?