文字列の代入サンプルです
DLLの内部的にutf16使ってるぽいんで
文字列を変換して代入してます
プロジェクトは新しくないで
DLLの中の関数とかもどっかに保存して
プロジェクトを継続使用推奨
プロジェクトの設定色々したんでw
// dllmain.cpp
#include <windows.h>
#include <string>
#include <vector>
#include <cwchar> // wcslen 用
#include "hsp3plugin.h"
// グローバル変数(使い回し用バッファ)
char* g_result = NULL; // 最初はNULL
int g_result_size = 0;
std::wstring utf16;
extern "C" __declspec(dllexport) void __stdcall Hello(){
// HSPから来た文字列をそのままMessageBoxWでポップアップ
MessageBoxW(NULL, L"Hello world!", L"SJIS", MB_OK | MB_ICONINFORMATION);
return;
}
// extern "C" で名前修飾なし、__declspec(dllexport) でエクスポート
// 新しい関数: 2つの文字列を連結して返す(hspmallocでメモリ確保)
extern "C" __declspec(dllexport) void __stdcall concat_old(char* s1, char* s2) {
strcat(s1, s2); // s2を追加
return;
}
// 修正版concat: グローバルバッファを使って連結
extern "C" __declspec(dllexport) int __stdcall concat(char* s1, char* s2) {
int len1 = strlen(s1);
int len2 = strlen(s2);
int total_len = len1 + len2 + 1;
if (g_result_size == 0) {
g_result = (char*)malloc(sizeof(char) * total_len);
g_result_size = total_len;
} else {
if (g_result_size < total_len) {
free(g_result);
g_result = (char*)malloc(sizeof(char) * total_len);
g_result_size = total_len;
}
}
strcpy(g_result, s1); // s1コピー
strcat(g_result, s2); // s2追加
return total_len;
}
extern "C" __declspec(dllexport) void __stdcall get_g_result(char* s1) {
strcpy(s1,g_result); // s1コピー
return;
}
// メモリ開放最後までに実行すること
extern "C" __declspec(dllexport) void __stdcall g_result_free(void) {
free(g_result);
return;
}
// Grok(AI)さんが生成w
std::wstring CharToWString(const char* multiByteStr, UINT codePage = 932) {
if (!multiByteStr || *multiByteStr == '\0') {
return std::wstring();
}
// 1. 必要なワイド文字列の長さを取得(ヌル込み)
int wideLen = MultiByteToWideChar(
codePage, // 932 = Shift-JIS (日本語Windows標準)
0, // フラグ(通常0)
multiByteStr,
-1, // -1 = ヌル終端まで処理
nullptr,
0
);
if (wideLen == 0) {
// エラー(GetLastError()で詳細取れるけど簡易で空返す)
return std::wstring();
}
// 2. バッファ確保して変換
std::wstring wideStr(wideLen, L'\0');
MultiByteToWideChar(
codePage,
0,
multiByteStr,
-1,
&wideStr[0],
wideLen
);
// 余分なヌル終端をresizeで切る(std::wstringは自動管理してくれる)
wideStr.resize(wcslen(wideStr.c_str()));
return wideStr;
}
// Grok(AI)さんが生成w
std::string WideToSjis(const std::wstring& utf16) {
if (utf16.empty()) return std::string();
int mbLen = WideCharToMultiByte(932, 0, utf16.c_str(), -1, nullptr, 0, nullptr, nullptr);
if (mbLen == 0) return std::string();
std::string sjis(mbLen, '\0');
WideCharToMultiByte(932, 0, utf16.c_str(), -1, &sjis[0], mbLen, nullptr, nullptr);
sjis.resize(strlen(sjis.c_str())); // 余分なヌル終端を切る(念のため)
return sjis;
}
// ほぼGrok(AI)さんが生成w
// 使い方超簡単例(DLL内で)
// メモリ開放最後までに実行すること
extern "C" __declspec(dllexport) void __stdcall ShowMessage(const char* sjisText) {
utf16 = CharToWString(sjisText);
// これでLPCWSTRとして使える!
MessageBoxW(NULL, utf16.c_str(), L"変換結果", MB_OK | MB_ICONINFORMATION);
}
extern "C" __declspec(dllexport) void __stdcall ReShow() {
MessageBoxW(NULL, utf16.c_str(), L"変換結果", MB_OK | MB_ICONINFORMATION);
}
// ほぼGrok(AI)さんが生成w
extern "C" __declspec(dllexport) int __stdcall RetSjis(char* outBuffer, int bufferSize) {
// UTF-16 → SJIS変換
std::string result = WideToSjis(utf16);
// ここで返したい文字列(例。実際は計算結果とかを入れる)
const char* message = result.c_str();
if (outBuffer == nullptr || bufferSize <= 0) {
return -1; // エラー
}
// 安全にコピー(バッファオーバー防止)
strncpy_s(outBuffer, bufferSize, message, _TRUNCATE);
// 成功したらコピーした文字数(バイト数)を返す
return (int)strlen(outBuffer);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_DETACH:
free(g_result);
break;
}
return TRUE;
}
文字コードの変換とか自分には出来なそうw
AIさんのおかげで書けましたw
//HSPのスクリプト
#uselib "TestHspDll.dll" ; DLL名そのまま
// 文字列の処理
#func Hello "_Hello@0"
#func ReShow "_ReShow@0"
#cfunc RetSjis "_RetSjis@8" var,int
#func ShowMessage "_ShowMessage@4" str
#cfunc concat "_concat@8" str,str
#func concat_old "_concat_old@8" var,str
// mallocしたメモリfree
#func g_result_free "_g_result_free@0"
// グローバル変数を取得
#func get_g_result "_get_g_result@4" var
Hello
sdim s3,1000
s3 = "こんにちわ"
ShowMessage s3
ReShow
sdim s4,1000
mes RetSjis(s4,64)
mes s4
stop
命令の後の@数字は引数のバイト数の合計みたいっすw
intは4byte doubleは8byte char配列はポインタで4byteみたいなw

コメント