文字列の代入サンプルです
DLLの内部的にutf16使ってるぽいんで
文字列を変換して代入してます
プロジェクトは新しくないで
DLLの中の関数とかもどっかに保存して
プロジェクトを継続使用推奨
プロジェクトの設定色々したんでw
// dllmain.cpp
#include <windows.h>
#include <string>
#include <vector>
#include <cwchar> // wcslen 用
#include "hsp3plugin.h"
std::wstring utf16; // グローバル変数
extern "C" __declspec(dllexport) int __stdcall ret_len() {
int byte_count = static_cast<int>(utf16.size() * 2);
return byte_count;
}
extern "C" __declspec(dllexport) void __stdcall Hello(){
// HSPから来た文字列をそのままMessageBoxWでポップアップ
MessageBoxW(NULL, L"Hello world!", L"SJIS", MB_OK | MB_ICONINFORMATION);
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;
}
// 使い方超簡単例(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);
}
extern "C" __declspec(dllexport) int __stdcall RetSjis(char* outBuffer, int bufferSize) {
// 例: 何かUTF-16文字列を作ったとする
// 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:
// メモリ開放とかdll終了時の処理を書く
//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 ret_len "_ret_len@0"
Hello
sdim s3,1000
s3 = "こんにちわ"
ShowMessage s3
ReShow
len=ret_len()
mes "len : " + len
sdim s4,len+4
mes RetSjis(s4,64)
mes s4
stop
命令の後の@数字は引数のバイト数の合計みたいっすw
intは4byte doubleは8byte char配列はポインタで4byteみたいなw

コメント