doubleの演算を書きました
doubleの返し方がわからなくて引数に代入
int演算の結果を引数に代入する命令書きました
str演算も書きました
グローバル変数に入れて使いまわすかんじ
hspmalloc動かなくて普通のmallocしました
//dllmain.cpp
#include <windows.h>
#include "hsp3plugin.h"
// グローバル変数(使い回し用バッファ)
char* g_result = NULL; // 最初はNULL
int g_result_size = 0;
// extern "C" で名前修飾なし、__declspec(dllexport) でエクスポート
extern "C" __declspec(dllexport) int __stdcall int_add(int a, int b) {
return a + b;
}
extern "C" __declspec(dllexport) void __stdcall int_add_p(int *a, int b) {
*a += b;
return;
}
extern "C" __declspec(dllexport) void __stdcall dbl_add_p(double *a, double b) {
*a += b;
return;
}
// 新しい関数: 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;
}
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;
}
//HSP3 sample#uselib "TestHspDll.dll" ; DLL名そのまま
// 文字連結。連結後のサイズを返す
// 文字列はグローバル変数に代入
// グローバル変数をmalloc
#cfunc concat "_concat@8" str,str
#func concat_old "_concat_old@8" var,str
#func dbl_add_p "_dbl_add_p@12" var,double
// mallocしたメモリfree
#func g_result_free "_g_result_free@0"
// グローバル変数を取得
#func get_g_result "_get_g_result@4" var
#cfunc int_add "_int_add@8" int,int
#func int_add_p "_int_add_p@8" var,int
mes int_add(100,20)
n=200
int_add_p n,40
mes n
d =1.4
dbl_add_p d,0.014
mes d
sdim s1,256
sdim s2,256
s1 = "abc";
s2 = "def"
concat_old s1,s2
mes s1
s3 = "ABC"
s4 = "DEF"
sdim tmptmp,30
tmp = concat(s3,s4)
mes tmp
sdim tmptmp,30
get_g_result tmptmp
mes tmptmp
g_result_free
stop
AIサポートGrok様 2025/12

コメント